Python 中,子類B繼承父類A時候會用class B(A):
的代碼形式聲明B。
class A:
def __init__(self, x=1, y=2):
self.x = x
self.y = y
print("In class A's init...")
def Aprint(self):
print("AAAAAAAAAAAAA")
在子類B的初始化方法默認會覆蓋掉父類A的初始化方法,舉例:
class B(A):
def __init__(self, z):
self.z = z
print("In class B's init...")
def Bprint(self):
print("BBBBBBBBBBBBB")
demo = B(3)
print(demo.z)
print(demo.x)
demo.Aprint()
demo.Bprint()
報錯顯示B中找不到成員x(肯定也找不到y成員):
注釋掉demo.x
這行就沒問題:
說明子類只是重寫了父類的__init__
方法,其他方法(Aprint
)得以繼承。
現在在B的__init__方法中加入一行代碼:super().__init__(x, y)
或者super(B, self).__init__(x, y)
,並且接受新的變量x、y:
class B(A):
def __init__(self, z, x, y):
# super(B, self).__init__(x, y)
super().__init__(x, y)
self.z = z
print("In class B's init...")
def Bprint(self):
print("BBBBBBBBBBBBB")
現在調用全體的變量和方法試試看:
demo = B(3,4,10)
print(demo.z)
print(demo.x)
print(demo.y)
demo.Aprint()
demo.Bprint()

這說明子類B中初始化方法中添加一行super().__init__(x, y)
代碼會調用父類A中的初始化方法,而不會直接的覆蓋父類初始化方法,同時注意傳參。
進一步地,子類中任意位置添加super().func(*args)
都會調用父類中的func()函數。
需要聲明的一點是,python2中,必須使用super(B, self).func(*args)
才能調用父類A中的func()函數;此外父類A也要繼承自object:class A(object):
,這在python3中是可以省略的。
修改后: