Class 个变量未与 class 个实例共享
Class variable is not shared with class instances
我读到 class 变量在所有实例之间共享。但我在 Python 终端中尝试过,但这种方式不起作用。
我哪里误会了?
似乎class变量只是在创建新对象时才使用。是真的吗?
>>> 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})
>>>
如果您创建 A
的实例并尝试读取 b
属性,它将 return class 变量,因为不存在实例变量:
>>> class A():
... b='class'
>>> z = A()
>>> z.b
'class'
当您为 z.b
赋值时,您正在创建一个名为 b
的 实例 变量,它隐藏 class 变量:
>>> class A():
... b='class'
>>> z = A()
>>> z.b = 'instance'
>>> z.b
'instance'
如果想访问class变量而不管是否存在同名实例变量,可以使用__class__
:
>>> class A():
... b='class'
>>> z = A()
>>> z.b = 'instance'
>>> z.b
'instance'
>>> z.__class__.b
'class'
我读到 class 变量在所有实例之间共享。但我在 Python 终端中尝试过,但这种方式不起作用。
我哪里误会了?
似乎class变量只是在创建新对象时才使用。是真的吗?
>>> 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})
>>>
如果您创建 A
的实例并尝试读取 b
属性,它将 return class 变量,因为不存在实例变量:
>>> class A():
... b='class'
>>> z = A()
>>> z.b
'class'
当您为 z.b
赋值时,您正在创建一个名为 b
的 实例 变量,它隐藏 class 变量:
>>> class A():
... b='class'
>>> z = A()
>>> z.b = 'instance'
>>> z.b
'instance'
如果想访问class变量而不管是否存在同名实例变量,可以使用__class__
:
>>> class A():
... b='class'
>>> z = A()
>>> z.b = 'instance'
>>> z.b
'instance'
>>> z.__class__.b
'class'