更改继承类的静态变量

时间:2019-05-07 11:34:23

标签: python python-3.x oop

考虑以下代码:

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属性就无法更改福特的速度变量。

为什么会这样?我本来以为福特最后也将是四岁。

3 个答案:

答案 0 :(得分:2)

您已经在Ford中创建了一个名为“ velocity”的新变量。如果您打印出FordChrysler等所有变量的字典,您会发现它们是不同的:

    >>> 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