Python类中的命名空间

时间:2013-01-12 23:23:01

标签: python class namespaces scope

我有这个:

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        print i                     # self.i will work just fine
        return 'hello world'

当我这样做时:

>>> x = MyClass()
>>> 
>>> x.f()

我收到了错误,正如所料。

我的问题是:

  1. 为什么我会收到错误?

  2. 为什么函数(或方法)定义的命名空间与包含该类的模块的全局命名空间之间没有命名空间?

  3. 除了使用self之外,还有其他方法可以在f中引用i吗?

2 个答案:

答案 0 :(得分:3)

  1. 您遇到错误,因为print i正在尝试打印全局(模块)变量i。如果您想使用该类的成员,您应该写self.i
  2. 因为Guido Van Rossum决定不使用命名空间。实际上,我不知道该怎么回答。
  3. 是的,但没有。是的,因为你可以使用“反射”(我不记得它是如何在python中调用的)并访问该类的任何成员。不,因为使用self是唯一可用的方式。

答案 1 :(得分:0)

为什么会出现错误?

答案:这是因为变量i和指向函数/方法代码的符号/级别f位于MyClass命名空间中,而函数f的值/可调用代码/主体位于全局命名空间中。

为什么函数的名称空间之间没有名称空间(或 方法)定义以及包含以下内容的模块的全局名称空间 上课吗?

答案:不确定为什么python设计人员决定将函数名称/符号放在类中,但将其主体放在全局名称空间中。

在这种情况下,是否还有其他方法可以在f内引用i 用自我吗?

答案:我不这么认为,但是即使如此,逻辑/代码也可能并不容易