Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类中类内类的命名空间

类中类内类的命名空间
EN

Stack Overflow用户
提问于 2014-10-23 08:22:59
回答 2查看 798关注 0票数 2

我正在尝试理解python2.7中名称空间的嵌套。

考虑以下不起作用的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class c(object):
  def debug(self):
     print globals(),locals()
     print x,y

class a(object):
   x=7 
   def __init__(self):
     self.y=9
   class b(object):
      def debug(self):
         print globals(),locals()
         print x,y
   class d(c):
      pass

如何从调用中访问变量x和y?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a().b().debug()
a.b().debug()
a().d().debug()
a.d().debug()

他们似乎都看不见x和y。

经过讨论,似乎只有显式扩展嵌套类的信息才能达到我想要的结果(避免引用全局)。例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class a(object):
   #
   @classmethod
   def _initClass(cls):
     for v in dir(cls):
       if type(cls.__dict__[v])==type:
         setattr(cls.__dict__[v],'vader',cls)   
   #
   x=7 
   class b(object):
     def debug(self):
       print b.vader.x
   class d(c):
     pass

 a._initClass()

而且,就像a().d().debug序列中所期望的那样,即使这种技术对于访问实例变量似乎也不有用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-23 08:51:28

Martijn已经给出了一个很好的答案,但我要尝试一下我自己的答案。

正如Martijn所说,类声明在第一次导入模块时,执行起来就像一次性函数一样,具有自己的本地作用域。在执行了类声明中的所有内容之后,这个本地范围中剩下的内容将被用作类的字典。因此,x__init__bd最终都是a类对象的属性。您的类bd也是如此;它们的主体在导入模块时执行,剩下的本地作用域也用作字典。

您的代码不能工作的原因是,当debug方法执行时,它唯一知道的作用域是全局作用域和它自己的本地作用域。在python中,方法不隐式地将类实例的字典作为其作用域的一部分,就像在C++这样的语言中所做的那样。类实例可以显式地作为self参数出现在参数列表中(因此,python的禅“显式优于隐式”--在python中尝试import this )。

而且,在访问和实例化其他类aa上的d之前,是否实例化a并不重要,因为bd都是a上的类属性。因此,python可以从b实例或直接引用a类对象成功地检索aa

票数 2
EN

Stack Overflow用户

发布于 2014-10-23 08:27:36

class对象不创建作用域;类主体只执行一次并被丢弃,生成类属性的本地命名空间。类主体从不参与嵌套作用域;它们在解析非本地名称时完全被忽略。

因此,您的x = 7不是嵌套的b类(或其方法)可以访问的名称。相反,它是a上的一个类属性。访问a.x将有效。y是一个实例属性,您必须有一个对实例的引用,才能在任何其他地方访问它。

注意,这也适用于class b;它现在是a上的一个类属性,就像x是一个类属性一样。

除了如何引用类对象之外,类b没有什么特别之处。仅仅因为您创建了a实例,并不意味着b对它有任何特权访问;a().b()不会在实例之间创建关系。你可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
b = a.b
b_instance = b()

也不会有什么区别。你甚至可以:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a.b.a = a
a.b.a()

世界也不会崩溃!(想象一下)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26532730

复制
相关文章
ruby学习笔记(11)--symbol与hash参数
symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001".object_id puts "0001".object_id puts "0001".object_id puts "0001".object_id 输出结果类似如下: 32088750 32088730 32088710 32088690 可以发现即使是同样内容的字符串"0001",在ruby解释器内部每次也
菩提树下的杨过
2018/01/22
1K0
hash冲突以及hash冲突的解决方法
首先说一下hash冲突吧,hash冲突在hash表中一般情况下是会遇到的; hash冲突指的是你在向hash表中存数据时,首先要通过key值进行指定的hash算法进行计算,然后得到一个值,这个值就是你要将这个key对应的value存入的地址。但是在这个地址中已经有值存在,所以这个时候就发生了hash冲突,不同的key通过hash算法得到了对应的同一个值。
全栈程序员站长
2022/11/07
1.2K0
解决hash冲突的几种方法_hashmap hash冲突
hash函数 首先来说hash函数,java中对象都已一个hashCode() 方法,那为什么还需要hash函数呢?hashCode是在jdk中是有符号int类型,这个一个很大的范围,如果散列表的数组能覆盖所有int值的话,就不需要hash函数了,当然内存不允许我们维护这么大的散列表。这时我们需要hash函数将原始hashCode映射到一个很小的数组上去。 常见的做法是取模法,也是jdk中的实现方式。
全栈程序员站长
2022/09/28
8280
解决hash冲突的几种方法_hashmap hash冲突
递归方法
  递归是指函数直接或间接调用自身的一种编程方法。调用的过程就是“递”,返回的过程就是归。基本上, 所有的递归问题都可以用递推公式来表示。
全栈程序员站长
2022/09/06
3380
递归方法的理解
递归思想算是编程中比较常见但对初学者而言又有些难以理解的方法了。在leetcode上刷了几道题都用递归思想成功解决后觉得应该贯彻互联网的开源共享精神,总结一下自己的爬坑经历了
我爱自然语言处理
2018/05/26
1.1K0
递归方法的理解
hash冲突解决方法
(2)拉链法中的链表上的节点空间是动态申请的,更适合于创造表之前无法确定表长的情况
2019/05/07
1.4K0
ddEntry(hash, key, value, i)方法根据计算出的hash值
ddEntry(hash, key, value, i)方法根据计算出的hash值,将key-value对放在数组table的i索引处。addEntry 是 HashMap 提供的一个包访问权限的方法(就是没有public,protected,private这三个访问权限修饰词修饰,为默认的访问权限,用default表示,但在代码中没有这个default),代码如下:
用户7365393
2021/10/07
7190
Ruby学习笔记之升级ruby的版本
升级ruby版本,有时候安装ruby的版本过低,需要进行升级,例如安装在centos6.7安装fpm需要ruby版本在1.9以上。
Jetpropelledsnake21
2019/04/25
3.2K0
vue的hash路由微信授权方法
示例代码: klren0312/wechatVueHash (github.com)
治电小白菜
2021/12/14
2.6K1
vue的hash路由微信授权方法
当使用vue的hash路由时, 微信授权重定向到前端时, 会把路由放到url最后, 例如
治电小白菜
2021/12/17
2.8K2
vue的hash路由微信授权方法
java 递归方法卡住_递归算法怎么理解
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/04
9320
Ruby执行shell命令的六种方法
在Ruby中,执行shell命令是一件不奇怪的事情,Ruby提供了大概6种方法供开发者进行实现。这些方法都很简单,本文将具体介绍一下如何在Ruby脚本中进行调用终端命令。
技术小黑屋
2018/09/04
3.3K0
Java递归方法求100的阶乘
//求100! import java.math.BigInteger; public class GetFactorial { public static void main(String[] args) { System.out.println(mul(new BigInteger("100")).toString()); } public static BigInteger mul(BigInteger i) { if (i.intValue() > 1) { Integer
yangjiao
2021/03/04
1.8K0
Java方法的嵌套与递归调用
方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是感觉有些绕。
一头小山猪
2020/04/08
2.5K0
Java方法的嵌套与递归调用
导出域内用户hash的几种方法
在渗透测试期间,可以利用域管权限对域内用户hash进行导出和破解。这些域内用户hash存储在域控制器(NTDS.DIT)中的数据库文件中,并带有一些其他信息,如组成员身份和用户。
Jumbo
2018/07/26
5K0
导出域内用户hash的几种方法
Ruby设计模式透析之 —— 模板方法(Template Method)
Java设计模式透析之 —— 模版方法(Template Method) 今天你还是像往常一样来上班,一如既往地开始了你的编程工作。 项目经理告诉你,今天想在服务器端增加一个新功能,希望写一个方法,
用户1158055
2018/01/05
8730
Ruby设计模式透析之 —— 模板方法(Template Method)
Ruby Programming | 连载 03 - Ruby 对象基础
Ruby 中所有的数据结构和值都是对象,包括基本的数字和字符串以及数组 Array、散列表 Hash 这样的复杂数据结构。
RiemannHypothesis
2022/10/05
2K0
Ruby Programming | 连载 03 - Ruby 对象基础
为什么说二叉树遍历用递归的方法不如非递归方法?
作者:find goo 链接:https://www.zhihu.com/question/24976589/answer/128338947 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
九州暮云
2019/08/21
1K0
Windows - Hash散列值抓取方法
LM Hash(LAN Manager Hash)其本质是 DES 加密。在 Windows 2008 及开始之后默认禁用的是 LM Hash。
渗透攻击红队
2020/11/25
1.9K0
Windows - Hash散列值抓取方法
点击加载更多

相似问题

Ruby中的嵌套Hash遍历递归

21

ruby中的递归Hash变换函数

38

Hash方法get on ruby

234

Ruby LDAP to_hash方法

10

Ruby方法双Splat与Hash

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文