15

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

class Foo:
    foo_string = "I am a foo"

    @staticmethod
    def foo():
        print foo_string

>>> Foo.foo()
  [Stack Trace]
  NameError: global name 'foo_string' is not defined

有什么想法吗?

4

1 回答 1

23

Python不会让类变量以这种方式落入作用域,有两种方法可以做到这一点,第一种是使用类方法:

@classmethod
def foo(cls):
    print(cls.foo_string)

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

第二种是通过名称访问:

@staticmethod
def foo():
    print(Foo.foo_string)

请注意,一般来说,使用类作为命名空间并不是最好的方法,只需使用具有顶级函数的模块,因为这更像你想要的那样。

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

于 2012-10-23T19:07:43.667 回答