Python的繼承
子類更新成員變量,但是父類的成員變量不會隨之更新。
import random
class A:
def __init__(self):
self.x = 1
def update(self):
self.x = random.random()
class B(A):
def __init__(self):
super(B, self).__init__()
class C(A):
def __init__(self):
super(C, self).__init__()
a = A()
b = B()
c = C()
print('a', a.x, id(a.x))
print('b', b.x, id(b.x))
print('c', c.x, id(c.x))
c.update()
print('-' * 10)
print('a', a.x, id(a.x))
print('b', b.x, id(b.x))
print('c', c.x, id(c.x))
輸出結果如下。
a 1 1588685888
b 1 1588685888
c 1 1588685888
----------
a 1 1588685888
b 0.966045428000231 2041177252680
c 1 1588685888
疑問:繼承後,是各個類各用一份內存來存變量嗎?
把上面的代碼,在初始化基類A的時候,x就直接用random來寫,其他不變,測試結果如下。
a 0.41789292733766636 1632024142664
b 0.25028585608102316 1632024142616
c 0.2558405710521733 1632024142160
----------
a 0.41789292733766636 1632024142664
b 0.12166442611660855 1632024142712
c 0.2558405710521733 1632024142160
注意:繼承後,各類成員變量的id。默認是佔用不同的內存,特殊情況下(如同一個常量)才指向同一個內存地址。
複習C++中相應的情況。
Review:C++(13):多繼承(multiple inheritance)
據說,在C++中,“用派生類的方法修改基類的東西要用虛函數”。