python中super用法研究

2021-07-16 16:01:28 字數 4458 閱讀 2214

python語言與c++有相似的類繼承,在類定義時,python中會自定義第乙個self,類似c++中this指標,指向物件自身。

python簡單的類舉例:

>>> class hello(object):

... def print_c():

... print"hello world!"

>>> hello().print_c()

hello world!

當然在實際中不可避免的需要類的繼承,子類繼承父類,正常如下:

>>> class child(hello):

... def print_c(self):

... hello().print_c()

...

>>> child().print_c()

hello world!

在python中還提供了super()機制,例子如下:

>>> class hello(object):

... def print_c(self):

... print"hello world!"

...

>>> class child(hello):

... def print_c(self):

... super(child,self).print_c()

...

>>> child().print_c()

hello world!

第一眼看過來是不是感覺一樣?

在python中引入super()的目的是保證相同的基類只初始化一次(注意:

1super ()機制是用來解決多重繼承的,對於直接呼叫父類名是沒有問題的,但在之後根據前人的經驗就是:要麼都用類名呼叫,要麼就全部用super(),不要混合的用,由此為人做事還是要專一的嘛o(∩_∩)o~

2 super()繼承只能用於新式類,用於經典類時就會報錯。

新式類:必須有繼承的類,如果無繼承的,則繼承object

經典類:沒有父類,如果此時呼叫super就會出現錯誤:『super() argument 1 must be type, not classobj)

好,再舉乙個例子

class parent1(object):

def __init__(self):

print 'is parent1'

print 'goes parent1'

class parent2(object):

def __init__(self):

print 'is parent2'

print 'goes parent2'

class child1(parent1):

def __init__(self):

print'is child1'

parent.__init__(self)

print 'goes child1'

class child2 (parent1) :

def __init__(self):

print 'is child2'

parent.__init__(self)

print 'goes child2'

class child3(parent2):

def __init__(self):

print 'is child3'

parent2.__init__(self)

print 'goes child3'

class grandson(child3,child2,child1):

def __init__(self):

print 'is grandson'

child1.__init__(self)

child2.__init__(self)

child3.__init__(self)

print'goes grandson'

if __name__=='__main__':

grandson()

is grandson

is child1

is parent1

goes parent1

goes child1

is child2

is parent1

goes parent1

goes child2

is child3

is parent2

goes parent2

goes child3

goes grandson

好了,在這兒發現什麼問題了沒有?對,基類parent1被多次執行,而有時我們只希望公共的類只被執行一次,那麼此時我們引入super()機制檢視效果:
class parent1(object):
def __init__(self):

super(parent1, self).__init__()

print 'is parent1'

print 'goes parent1'

class parent2(object):

def __init__(self):

super(parent2, self).__init__()

print 'is parent2'

print 'goes parent2'

class child1(parent1):

def __init__(self):

print'is child1'

#parent1.__init__(self)

super(child1, self).__init__()

print 'goes child1'

class child2 (parent1) :

def __init__(self):

print 'is child2'

#parent1.__init__(self)

super(child2, self).__init__()

print 'goes child2'

class child3(parent2):

def __init__(self):

print 'is child3'

#parent2.__init__(self)

super(child3, self).__init__()

print 'goes child3'

class grandson(child3,child2,child1):

def __init__(self):

print 'is grandson'

#child1.__init__(self)

#child2.__init__(self)

#child3.__init__(self)

super(grandson, self).__init__()

print'goes grandson'

if __name__=='__main__':

grandson()

此時我們檢視結果:
is grandson

is child3

is child2

is child1

is parent1

goes parent1

goes child1

goes child2

is parent2

goes parent2

goes child3

goes grandson

結果很明顯,公共基類parent1只被執行一次。

grandson類的繼承體系如下圖所示:

object

|/ \

p1 p2

/ \ |

c1 c2 c3

所以對於類的繼承體系,我們可以看做乙個圖,而每乙個類看做乙個節點,那麼super()機制的執行順序是按照圖的廣度優先搜尋演算法查詢super()的父類。

後續總結:

1. super()是乙個類名而非函式,super(class, self)事實上呼叫了super類的初始化函式,

產生了乙個super物件;

2 super()機制必須要用新式類,否則會報錯;

3 super()或直接父類呼叫最好只選擇一種形式。

Python中super的用法

super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。普通繼承 python view p...

Python中super的用法

分類 python 2014 05 21 17 50 6637人閱讀收藏 舉報super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類...

python類中super 用法

note super only works for new style classes.super 函式的乙個常見用法是在 init 方法中確保父類被正確的初始化了作用super 函式是子類用於呼叫父類 超類 的乙個方法。super 是用來解決多重繼承問題的,直接用類名呼叫父類 base.init ...