对象变量与类变量
这是一个完全理论性的问题。假设有以下代码:
>>> class C:
... a = 10
... def f(self): self.a = 999
...
>>>
>>> C.a
10
>>> c = C()
>>> c.a
10
>>> c.f()
>>> c.a
999
在这个时候,类变量 C.a
还能通过对象 c
访问吗?
4 个回答
1
所有类的变量都可以通过从这个类创建的对象来访问。
>>> class C:
... a = 10
... def f(self): self.a = 999
...
>>> C.a
10
>>> c = C()
>>> c.a
10
>>> c.f()
>>> c.a
999
>>> c.__class__.a
10
>>> c.a
999
>>> del(c.a)
>>> c.a
10
属性会先在对象的命名空间中查找,如果找不到,再去类里面查找。
1
是的,你可以通过对象 c
来访问 a
,就像这样 c.a
。一开始这个值是10。
不过,如果你调用 c.f()
,那么 c.a
的值就会变成999,但 C.a
仍然是10。同样的,如果你把 C.a
改成1000,c.a
还是999。
简单来说,当你创建一个 C
的实例时,它会把类里的变量当作自己的 a
值,直到 你改变这个实例的 a
值,这样它就不再和类里的 a
共享了。
4
是的,可以使用 c.__class__.a
或 type(c).a
。这两者有一点不同,旧式类(希望现在都已经不再使用了——但谁知道呢……)的 type()
返回的是 <type 'instance'>
(而 __class__
的表现是正常的)。而对于新式类来说,type()
和 __class__
是一样的,只有在对象重写了属性访问的时候才会有所不同。