Python中多繼承與super 用法

2021-07-25 05:17:56 字數 1738 閱讀 9897

python類分為兩種,一種叫經典類,一種叫新式類。兩種都支援多繼承。

考慮一種情形,b繼承於a,c繼承於a和b, 但c需要呼叫父類的init()函式時,前者會導致父類a的init()函式被呼叫2次,這是不希望看到的。而且子類要顯式地指定父類,不符合dry原則。

# 經典類

class

a():

def__init__

(self):

print

'a'class

b(a):

def__init__

(self):

a.__init__(self)

print

'b'class

c(b, a):

def__init__

(self):

a.__init__(self)

b.__init__(self)

print

'c'

採用新式類,要求最頂層的父類一定要繼承於object,這樣就可以利用super()函式來呼叫父類的init()等函式,每個父類都執行且執行一次,並不會出現重複呼叫的情況。而且在子類的實現中,不用到處寫出所有的父類名字,符合dry原則。

# 新式類

class

a(object):

def__init__

(self):

print

'a'class

b(a):

def__init__

(self):

super(b, self).__init__()

print

'b'class

c(b, a):

def__init__

(self):

super(c, self).__init__()

print

'c'

採用super()方式時,會自動找到第乙個多繼承中的第乙個父類,但是如果還想強制呼叫其他父類的init()函式或兩個父類的同名函式時,就要用老辦法了。

class

person

(object):

name = ""

*** = ""

def__init__

(self, name, ***='u'):

print

'person'

self.name=name

self.***=***

class

consumer

(object):

def__init__

(self):

print

'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...