Наследование классов Python: как получается этот вывод? - PullRequest
0 голосов
/ 20 мая 2018

Когда я запускаю этот код, он выводит как 10 10 10 12 24 10. Может ли кто-нибудь помочь мне в понимании вывода?Я новичок в программировании на Python

class A:
    x = 10

class B(A):
    pass

class C(A):
    pass

print (A.x)

print (B.x)

print (C.x)

A.x += 2

B.x *= 2

C.x -= 2

print (A.x)

print (B.x)

print (C.x)

1 Ответ

0 голосов
/ 21 мая 2018

Я не знаю, какие языки программирования вы знаете, но Python здесь работает иначе, чем другие языки.В C ++ вы просто предполагаете, что переменная x существует 3 раза как собственные экземпляры, что означает, что переменные независимы друг от друга.Это привело бы к выходной последовательности 10 10 10 12 20 8.

Однако я думаю, что для Python здесь происходит следующее:

  • Вы создаете класс A с переменной x= 10. При создании классов B и C они не создают свою собственную переменную x.Вместо этого B и C имеют «ссылку» на Ax. Поэтому сначала вы получаете 10 10 10.
  • Вы меняете Ax + = 2, так что теперь x = 12.Когда вы изменяете Bx * = 2, то для Bx делается следующее назначение: Bx = Ax * 2. С этого момента Bx является собственной переменной, независимой от Ax То же самое происходит для Cx - = 2. Это приводит кпоследовательность 12 24 10.

Я думаю, что для Python вам нужно знать понятие «вызов по объекту», которое вездесуще.Он отличается от известных понятий «вызов по значению» или «вызов по ссылке».См. Также Является ли вызов Python ссылкой или значением .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...