python的類中super()的使用

2021-08-23 12:16:46 字數 2693 閱讀 2762

ote: super() only works for new-style classes.

super() 函式的乙個常見用法是在 __init__() 方法中確保父類被正確的初始化了

作用

super() 函式是子類用於呼叫父類(超類)的乙個方法。

super 是用來解決多重繼承問題的,直接用類名呼叫父類(base.__init__(self))方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序(mro)、重複呼叫(鑽石繼承)等種種問題。

mro 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。

使用場景

假如說在父類中實現了乙個方法,你想在子類中使用父類的這個方法並且做一定擴充套件但是又不想完全重寫,並且這個場景中的繼承屬於多繼承,那麼super()就出場了,可以實現方法的增量修改。
呼叫方式

python2:

super(currentclass, self).method(arg)

python3:

super().method(arg)

使用舉例

class basicclasspeople(object):

def __init__(self,name,age,gender):

self.name = name

self.age = age

self.gender = gender

def short_introduction(self):

print 'my name is {}, a {}, this year i am {} years old'.format(self.name,self.gender,self.age)

class extenclassone(basicclasspeople):

def __init__(self,name,age,gender,job):

super(extenclassone, self).__init__(name,gender,age)

self.job = job

def short_introduction(self):

print 'my name is {}, a {}, this year i am {} years old, my job is {}'.format(self.name, self.gender, self.age,self.job)

在上邊的程式中extenclassone繼承自basicclasspeople,但是它想在初始化的時候為類新增加乙個屬性,如果不使用super的話我們就只能重寫初始化函式了,但是使用了super之後我們只需要在定義擴充套件的初始化函式時呼叫父類初始化函式,然後把自己新增的屬性新增到呼叫語句後面就可以了。

super()可以避免重複呼叫

class base:

def __init__(self):

print('base.__init__')

class a(base):

def __init__(self):

base.__init__(self)

print('a.__init__')

class b(base):

def __init__(self):

base.__init__(self)

print('b.__init__')

class c(a,b):

def __init__(self):

a.__init__(self)

b.__init__(self)

print('c.__init__')

執行這段**就會發現 base.__init__() 被呼叫兩次,如下所示:

>>> c = c()

base.__init__

a.__init__

base.__init__

b.__init__

c.__init__

>>>

使用super()之後

class base:

def __init__(self):

print('base.__init__')

class a(base):

def __init__(self):

super().__init__()

print('a.__init__')

class b(base):

def __init__(self):

super().__init__()

print('b.__init__')

class c(a,b):

def __init__(self):

super().__init__() # only one call to super() here

print('c.__init__')

執行結果:

發現每個__init__() 方法只會被呼叫一次了:

>>> c = c()

base.__init__

b.__init__

a.__init__

c.__init__

>>>

python 中類繼承的super 方法

參考 python中的super 方法主要用於子類引用父類方法,因為這樣做可以提高 的復用性 usr bin env python coding utf 8 用於測試類繼承的super 方法 class a object 父類 def init self,a,b self.a a self.b b ...

python 類中super 方法的使用

super 是python中子類呼叫父類的一種方法 對於不呼叫super init 會出現某些錯誤 詳情請看 class engine def init self self.performance 80class skeleton def init self self.shape rectangle...

python類中super 用法

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