【问题标题】:Is it possible to increment/access a class variable from inside a constructor in Python?是否可以从 Python 的构造函数内部递增/访问类变量?
【发布时间】:2018-01-17 20:55:06
【问题描述】:

我想在每次实例化类时通过计数器进行跟踪。我试图通过从类的构造函数 ala 中增加一个定义为类变量的计数器来做到这一点:

class Cl:
   cntr = 0
   def __init__(self):
      cntr += 1

但是,当我实例化该类时,我得到一个“UnboundLocalError: local variable 'cntr' referenced before assignment”我假设这是因为构造函数将其视为局部变量。如何在 Python 2.7 的方法或构造函数中引用类变量?

【问题讨论】:

  • @Stack 不会增加类变量,它会创建一个实例变量来隐藏类变量。
  • 是的,当然。 cntr 这里被编译器标记为本地,因为你分配给它,但即使你没有,它会先检查本地然后全局,从不检查类命名空间。
  • 在类本身中这样做是一个糟糕的设计(跟踪实例不是他的责任)。在元类或其他一些外部注册表中执行此操作。

标签: python python-2.7


【解决方案1】:

你只需要通过类调用变量:

class Cl:
    cntr = 0
    def __init__(self):
        Cl.cntr += 1  # <---Like this


print(Cl().cntr)  # prints 1
print(Cl().cntr)  # prints 2
print(Cl().cntr)  # prints 3

【讨论】:

    【解决方案2】:
    class Foo:
        n = 0
        def __init__(self):
            self._increment()
    
        @classmethod
        def _increment(cls):
            cls.n += 1
    
    f1 = Foo()
    f2 = Foo()
    
    >>> f1.n
    2
    
    >>> f2.n
    2
    

    【讨论】:

    • 尽管在 Python 2 上,请确保使用新样式的类。不确定classmethod 是否会正常运行
    猜你喜欢
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2018-06-06
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多