如何在没有self的情况下访问类范围变量?

Luc*_*iel 11 python static scope class

所以我有一个类,我将其用作本地命名空间.我在类中有一些静态函数,但它们无法访问类范围变量.为什么是这样?

class Foo:
    foo_string = "I am a foo"

    @staticmethod
    def foo():
        print foo_string
Run Code Online (Sandbox Code Playgroud)
>>> Foo.foo()
  [Stack Trace]
  NameError: global name 'foo_string' is not defined
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Gar*_*tty 12

Python不允许类变量以这种方式落入范围,有两种方法可以做到这一点,第一种是使用类方法:

@classmethod
def foo(cls):
    print(cls.foo_string)
Run Code Online (Sandbox Code Playgroud)

我认为这是最好的解决方案.

第二种是通过名称访问:

@staticmethod
def foo():
    print(Foo.foo_string)
Run Code Online (Sandbox Code Playgroud)

请注意,一般来说,使用类作为命名空间并不是最好的方法,只需使用具有顶级函数的模块,因为这样可以更好地执行操作.

缺乏这样的范围的原因主要是由于Python的动态特性,当你将一个函数插入类时它会如何工作?它必须有条件地添加特殊行为,这将非常难以实现并且可能非常脆弱.它还有助于保持事物的显式而不是隐式 - 很清楚什么是类变量而不是局部变量.

  • 在 3.x 类编译中,任何引用 `__class__` 的函数都会成为一个闭包。`__class__` 的单元格由新的 `__build_class__` 内置函数设置。`staticmethod` 从 3.x 中删除,因此在类中定义的普通函数可以引用 `__class__`。 (3认同)