关于python:为什么我可以覆盖类变量?

Why can I override a class variable? Pointer being overridden?

本问题已经有最佳答案,请猛点这里访问。

我有一点代码:

1
2
3
4
5
6
7
8
9
10
11
12
class Car:
    wheels = 4


if __name__ =="__main__":
    car = Car()
    car2 = Car()
    print(car2.wheels)
    print(car.wheels)
    car.wheels = 3
    print(car.wheels)
    print(car2.wheels)

输出:

1
2
3
4
4
4
3
4

这里"轮子"被定义为类变量。类变量由所有对象共享。但是,我可以更改该类的特定实例的值吗?

现在我知道要修改类变量,我需要使用类名:

1
Car.wheels = 3

我仍然不明白这是怎么发生的。我是在创建实例变量,还是使用以下方法覆盖该实例的类变量:

1
Car.wheels = 3

--或者别的什么?


是的,您不重写类属性wheels,而是为对象car创建一个名为wheels的实例属性,并将其设置为3。

这可以使用特殊的__dict__属性进行验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> class Car:
...   wheels=4
...
>>> c1 = Car()
>>> c2 = Car()
>>>
>>> c1.wheels=3
>>> c1.wheels
3
>>> c2.wheels
4
>>> c1.__dict__
{'wheels': 3}
>>> c2.__dict__
{}