【问题标题】:Class variable is not shared with class instances类变量不与类实例共享
【发布时间】:2020-10-14 05:28:07
【问题描述】:

我读到类变量在所有实例之间共享。但是我在 Python 终端中尝试过,但它不能这样工作。

我在这里误会了什么?

似乎只有在创建新对象时才使用类变量。是真的吗?

>>> class A():
...     b=None
...
>>> z=A()
>>> z.b
>>> z.b=1
>>> z.b
1
>>> A.b
>>> A.b=2
>>> A.b
2
>>> z.b  
1         # expected to be 2 instead of 1
>>> x=A()
>>> x.b
2
>>> x.__dict__
{}
>>> z.__dict__
{'b': 1}
>>> A.__dict__
mappingproxy({'__module__': '__main__', 'b': 2, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})
>>>

【问题讨论】:

  • 如果它的类变量尝试使用 classname.variable 名称。前任。 A.b ,您已经创建了对象,并且对于每个对象,它将具有不同的值
  • 当您在实例上分配给类变量时,您正在隐藏类变量:z.b=1

标签: python class object variables nonetype


【解决方案1】:

如果您创建A 的实例并尝试读取b 属性,它将返回类变量,因为不存在实例变量:

>>> class A():
...     b='class'
>>> z = A()
>>> z.b
'class'

当您为 z.b 赋值时,您正在创建一个名为 binstance 变量,它会隐藏类变量:

>>> class A():
...     b='class'
>>> z = A()
>>> z.b = 'instance'
>>> z.b
'instance'

如果要访问类变量而不考虑是否存在同名的实例变量,可以使用__class__

>>> class A():
...     b='class'
>>> z = A()
>>> z.b = 'instance'
>>> z.b
'instance'
>>> z.__class__.b
'class'

【讨论】:

    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多