【问题标题】: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

有什么想法吗?

【问题讨论】:

    标签: python class static scope


    【解决方案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 我不使用模块作为命名空间的主要原因是我有嵌套命名空间的嵌套类,管理这么多小文件很麻烦。
    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2012-08-11
    • 2015-12-24
    • 1970-01-01
    • 2018-05-28
    • 2015-01-03
    • 1970-01-01
    相关资源
    最近更新 更多