python類分為兩種,一種叫經典類,一種叫新式類。兩種都支援多繼承。
考慮一種情形,b繼承於a,c繼承於a和b, 但c需要呼叫父類的init()函式時,前者會導致父類a的init()函式被呼叫2次,這是不希望看到的。而且子類要顯式地指定父類,不符合dry原則。
# 經典類class
a():
def__init__
(self):
'a'class
b(a):
def__init__
(self):
a.__init__(self)
'b'class
c(b, a):
def__init__
(self):
a.__init__(self)
b.__init__(self)
'c'
採用新式類,要求最頂層的父類一定要繼承於object
,這樣就可以利用super()函式來呼叫父類的init()等函式,每個父類都執行且執行一次,並不會出現重複呼叫的情況。而且在子類的實現中,不用到處寫出所有的父類名字,符合dry原則。
# 新式類class
a(object):
def__init__
(self):
'a'class
b(a):
def__init__
(self):
super(b, self).__init__()
'b'class
c(b, a):
def__init__
(self):
super(c, self).__init__()
'c'
採用super()方式時,會自動找到第乙個多繼承中的第乙個父類,但是如果還想強制呼叫其他父類的init()函式或兩個父類的同名函式時,就要用老辦法了。
class
person
(object):
name = ""
*** = ""
def__init__
(self, name, ***='u'):
'person'
self.name=name
self.***=***
class
consumer
(object):
def__init__
(self):
'consumer'
class
student
(person, consumer):
def__init__
(self, score,name):
print student.__bases__
super(student, self).__init__(name, ***='f')
consumer.__init__(self)
self.score=score
s1 = student(90, 'abc')
print s1.name, s1.score, s1.***
Python中的多繼承
python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。class p1 object deffoo self print p1 foo class p2 object deffoo...
python中的多繼承
一 介紹 python同樣有限的支援多繼承形式。多繼承的類定義形如下例 class derivedclassname base1,base2,base3 需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜尋 即方法在子類中未找到時,從左到右查詢父類中是...
Python中的多繼承
coding utf8 1.多繼承 子類有多個父類 class human def init self,self.defp self print 這是human的方法 class person def init self,name self.name name defp self print 這是p...