Изменение статической переменной унаследованных классов - PullRequest
0 голосов
/ 07 мая 2019

Рассмотрим следующий код:

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

Когда я впервые изменил скорость на три, все унаследованные классы изменили свою статическую переменную на три.Однако, если я изменю переменную скорости Ford, я больше не смогу изменить переменную скорости Ford, просто изменив атрибут Car.

Почему это так?Я бы ожидал, что Форду тоже будет четыре.

Ответы [ 3 ]

2 голосов
/ 07 мая 2019

Это потому, что в начале ни один из двух подклассов не имеет своей скорости, поэтому они наследуют их от суперкласса. Как только вы установите скорость дочернего класса, он переопределит скорость для него и больше не будет смотреть на скорость суперкласса.

2 голосов
/ 07 мая 2019

Вы создали новую переменную с именем 'speed' в Ford. Если вы распечатаете словарь всех переменных, например, Ford и Chrysler, вы увидите, что они разные:

    >>> print(Ford)
    <class '__main__.Ford'>
    >>> print (Ford.__dict__)
    {'__module__': '__main__', '__doc__': None, 'velocity': 2}
    >>> print (Chrysler.__dict__)
    {'__module__': '__main__', '__doc__': None}

С этого момента, если вы получите доступ к 'speed' в Ford, вы получите тот, который в словаре Ford, а не в базовом классе.

1 голос
/ 07 мая 2019

Код никогда не изменяет статический базовый класс из дочернего класса.Создает новую переменную для дочернего класса.Замените 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...