2

我有这个:

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 吗?

4

2 回答 2

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

为什么我会收到错误消息?

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

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

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

在这种情况下,除了使用 self 之外,还有其他方法可以在 f 中引用 i 吗?

答:我不这么认为,但即使是这样,它也可能不是更容易的逻辑/代码

于 2020-02-02T03:16:08.477 回答