对象变量与类变量

3 投票
4 回答
544 浏览
提问于 2025-04-16 05:23

这是一个完全理论性的问题。假设有以下代码:

>>> 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__.atype(c).a。这两者有一点不同,旧式类(希望现在都已经不再使用了——但谁知道呢……)的 type() 返回的是 <type 'instance'>(而 __class__ 的表现是正常的)。而对于新式类来说,type()__class__ 是一样的,只有在对象重写了属性访问的时候才会有所不同。

撰写回答