【问题标题】:Use class name to access static variables使用类名访问静态变量
【发布时间】:2017-11-01 19:16:53
【问题描述】:

有没有办法在不显式使用类名的情况下访问类变量,以防我以后决定更改类名?

类似的东西

static_variable = 'stuff'

className = CLASS

def method (self):
    className.static_variable

这可以通过简单的方式实现吗?

回答

self.static_variable __class__.static_variable

【问题讨论】:

  • 你不只是在做self.TABLE的任何特殊原因?
  • 或者__class__.TABLE,如果你仍然要依赖神奇的__class__闭包变量?
  • 作为一个重击规则:在你的类中,你不需要知道类的名称(一个例外:super 在 python-2.x 中,可能在 __repr__ 或 @ 987654327@)。每当您发现需要班级名称时,可能会有更好/更简单的方法。
  • @Rethipher:暂时忽略这些东西应该是类变量还是实例变量,你不知道你可以通过self读取类变量吗?
  • @Rethipher 你什么时候需要区分? self.foo 首先在实例中检查名为 foo 的属性,如果没有,则开始按照 MRO 顺序查找 foo 作为基类的类属性。具有相同名称的实例变量和类变量将是糟糕的设计。

标签: python class static-methods static-variables class-names


【解决方案1】:

别忘了阅读 cmets。


对于任何正在寻找答案的人,暂时忽略混合静态变量和实例变量是否是个好主意。

有两种简单的方法可以解决这个问题。

第一种方式

class MyClass():
    static_variable = 'VARIABLE'

    def __init__(self):
        self.instanceVariable = 'test'

    def access_static(self):
        print(__class__.static_variable)

第二种方式

class MyClass():
    static_variable = 'VARIABLE'

    def __init__(self):
        self.instanceVariable = 'test'

    def access_static(self):
        print(self.static_variable)

可以使用 class.static_variable 或使用 self.static_variable 只要没有在代码中的某处为 self.static_variable 定义实例变量。

虽然使用 self 会使您在访问静态变量还是实例变量方面变得模棱两可,所以我首选的做法是简单地在 static_variable 前面加上 而不是 ClassName.static_variable

【讨论】:

  • 请不要再称它们为静态变量了。它们被称为类变量;他们没有什么特别的静态。
  • @chepner 只要你知道它的作用,你怎么称呼它并不重要。我在 matlab、Simulink、python、c、c++,有时还有 java 之间来回走动。他们都把这些概念称为不同的东西。我怎么强调这个名字的重要性都不为过。
  • 这很重要。例如,静态方法和类方法之间存在很大差异。 可能知道静态变量是什么意思;不要以为别人会。
猜你喜欢
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多