如何在没有自我的情况下访问类范围变量?
Posted
技术标签:
【中文标题】如何在没有自我的情况下访问类范围变量?【英文标题】:How to access class-scope variables without self? 【发布时间】:2012-10-13 19:08:00 【问题描述】:所以我有一个类,我将其用作本地命名空间。我在类中有一些静态函数,但它们无法访问类范围变量。这是为什么呢?
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
有什么想法吗?
【问题讨论】:
【参考方案1】:Python不会这样让类变量落入作用域,有两种方法,第一种是使用类方法:
@classmethod
def foo(cls):
print(cls.foo_string)
我认为这是最好的解决方案。
第二种是按名称访问:
@staticmethod
def foo():
print(Foo.foo_string)
请注意,一般来说,使用类作为命名空间并不是最好的方法,只需使用具有***函数的模块即可,因为这更符合您的意愿。
没有像这样的作用域的原因主要是由于 Python 的动态特性,当你在类中插入一个函数时它会如何工作?它必须有条件地添加特殊行为,这将非常难以实现并且可能很脆弱。它还有助于使事情保持明确而不是隐含 - 很清楚什么是类变量而不是局部变量。
【讨论】:
在 3.x 类编译中,任何引用__class__
的函数都会变成闭包。 __class__
的单元格由新的 __build_class__
内置函数设置。 staticmethod
已从 3.x 中删除,因此类中定义的普通函数可以引用 __class__
。
@DanielRoseman 我不使用模块作为命名空间的主要原因是我有嵌套命名空间的嵌套类,管理这么多小文件很麻烦。以上是关于如何在没有自我的情况下访问类范围变量?的主要内容,如果未能解决你的问题,请参考以下文章