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

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 我不使用模块作为命名空间的主要原因是我有嵌套命名空间的嵌套类,管理这么多小文件很麻烦。

以上是关于如何在没有自我的情况下访问类范围变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用类名作为范围的情况下获取类中成员函数的地址?

离开范围后类变量会自动删除,我如何防止这种情况发生?

如何在没有直接继承的情况下访问基类容器中的派生对象

如何在不默认创建新范围的情况下在 tensorflow 中重用变量范围?

在同一类中的 setTimeout 期间维护变量

如何在没有数据库的情况下将来自我的个人 API 的数据显示到仪表板?