【问题标题】:Python class variables or class variables in generalPython类变量或一般类变量
【发布时间】:2011-03-24 06:44:23
【问题描述】:

从潜入 Python:

类属性都可以通过直接引用 类并通过该类的任何实例。

类属性可以用作类级别的常量,但它们是 不是真正的常数。您也可以更改它们。

所以我在 IDLE 中输入:

IDLE 2.6.5      
>>> class c:
        counter=0


>>> c
<class __main__.c at 0xb64cb1dc>
>>> v=c()
>>> v.__class__
<class __main__.c at 0xb64cb1dc>
>>> v.counter += 1
>>> v.counter
1
>>> c.counter
0
>>> 

那么我做错了什么?为什么类变量不能通过直接引用类和类的任何实例来保持其值。

【问题讨论】:

  • 由于 c.counter 还是 0,你显然没有改变它的值。但是,您确实更改了 v 实例的 counter 属性的值。
  • 我认为您正在寻找“静态类变量”。可能是stackoverflow.com/questions/68645/… 的副本

标签: python oop


【解决方案1】:

因为 int 在 python 中是不可变的

v.counter += 1

v.counter 重新绑定到一个新的 int 对象。重新绑定会创建一个实例属性来掩盖类属性

如果您查看id()v.counter,您可以看到这种情况

>>> id(v.counter)
149265780
>>> v.counter+=1
>>> id(v.counter)
149265768

在这里您可以看到v 现在在其__dict__ 中有一个新属性

>>> v=c()
>>> v.__dict__
{}
>>> v.counter+=1
>>> v.__dict__
{'counter': 1}

对比counter 是可变的情况,例如list

>>> class c:
...  counter=[]
... 
>>> v=c()
>>> v.counter+=[1]
>>> c.counter
[1]
>>> 

【讨论】:

  • 我会说:一个新的 int 对象...到v.counter
【解决方案2】:

之前:

c.counter = 0
v.counter -> c.counter

期间:

c.counter = 0
v.counter = c.counter + 1

之后:

c.counter = 0
v.counter = 1

【讨论】:

    【解决方案3】:

    请注意,您仍然可以获得类值:

    v.__class__.__dict__['counter'] 
    

    将允许您读取或设置您的类,即使您通过向实例的 __dict__ 添加符号来隐藏该符号。

    【讨论】:

      【解决方案4】:

      您对声明实例化感到困惑。

      C 是您声明的类的名称。

      v 是一个对象,由 c 实例化。

      【讨论】:

      • 这不是这里的混淆。如果你在一个类上设置一个变量,你可以按照上面的方式很好地读取它:instance.classvariable。
      猜你喜欢
      • 2017-12-05
      • 2012-01-31
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 2016-11-07
      • 2017-05-04
      相关资源
      最近更新 更多