考虑以下代码:
class Car():
velocity = 1
class Chrysler(Car):
pass
class Ford(Car):
pass
print(f"Car:\t\t {Car.velocity}")
print(f"Chryler:\t {Chrysler.velocity}")
print(f"Ford:\t\t {Ford.velocity}")
print()
Car.velocity = 3
print(f"Car:\t\t {Car.velocity}")
print(f"Chryler:\t {Chrysler.velocity}")
print(f"Ford:\t\t {Ford.velocity}")
print()
Ford.velocity = 2
Car.velocity = 3
print(f"Car:\t\t {Car.velocity}")
print(f"Chryler:\t {Chrysler.velocity}")
print(f"Ford:\t\t {Ford.velocity}")
print()
Car.velocity = 4
print(f"Car:\t\t {Car.velocity}")
print(f"Chryler:\t {Chrysler.velocity}")
print(f"Ford:\t\t {Ford.velocity}")
输出结果:
Car: 1
Chryler: 1
Ford: 1
Car: 3
Chryler: 3
Ford: 3
Car: 3
Chryler: 3
Ford: 2
Car: 4
Chryler: 4
Ford: 2
我第一次将速度更改为三个,所有继承的类都将其静态变量更改为三个。但是,如果更改福特的速度变量,仅通过更改Car属性就无法更改福特的速度变量。
为什么会这样?我本来以为福特最后也将是四岁。
答案 0 :(得分:2)
您已经在Ford
中创建了一个名为“ velocity”的新变量。如果您打印出Ford
和Chrysler
等所有变量的字典,您会发现它们是不同的:
>>> print(Ford)
<class '__main__.Ford'>
>>> print (Ford.__dict__)
{'__module__': '__main__', '__doc__': None, 'velocity': 2}
>>> print (Chrysler.__dict__)
{'__module__': '__main__', '__doc__': None}
从这里开始,如果您在Ford
中访问“ velocity”,您将在Ford
的字典中找到它,而不是基类中的那个。
答案 1 :(得分:2)
这是因为在开始时,两个子类都没有速度,因此它们是从超类继承的。一旦设置了子类的速度,它将为他覆盖速度,并且不再使用父类的速度。
答案 2 :(得分:1)
代码从不更改子类的基类静态。它为子类创建一个新变量。将velocity
替换为velocityX
,它将得到澄清。
class Car():
velocity = 1
class Chrysler(Car):
pass
class Ford(Car):
pass
Ford.velocityX = 2
Car.velocity = 3
print(f"Car:\t\t {Car.velocity}")
print(f"Chryler:\t {Chrysler.velocity}")
print(f"Ford:\t\t {Ford.velocity}")
print(f"Ford velocityX:\t\t {Ford.velocityX}")
print()
Car.velocity = 4
print(f"Car:\t\t {Car.velocity}")
print(f"Chryler:\t {Chrysler.velocity}")
print(f"Ford:\t\t {Ford.velocity}")
请参考以下输出:
Car: 3
Chryler: 3
Ford: 3
Ford velocityX: 2
Car: 4
Chryler: 4
Ford: 4