您的位置 首页 kreess

super() 函數詳解:隱式訪問父類(超類)的被重載方法(Python3)

1. 前言super()函數的主要作用是調用父類(超類)以及多層父類中的方法,這對於訪問已在類中重寫的繼承方法很有用。super()函數比較常用的情況有2種:單繼承的類層次

1. 前言

super()函數的主要作用是調用父類(超類)以及多層父類中的方法,這對於訪問已在類中重寫的繼承方法很有用。

super()函數比較常用的情況有2種:

  1. 單繼承的類層次結構中,例如:class B(A)、class C(A)。super()函數可用於以訪問其父類的方法,而不顯式命名父類。從而可以使代碼易於維護(顯式命名在修改父類名稱的時候比較崩潰)。
  2. 多繼承的類層次結構中,Python支持當前類同時繼承多個類作為其父類。並且按照調用類的MRO(方法解析順序 – method resolution order)順序進行向上查找。

2. super() 函數

super([type[, object-or-type]])

type[可選]- 類,如填寫則一般為當前類名。

object-or-type[可選]- 對象或者類,如果該參數為對象(例如:super(type, obj))則isinstance(obj, type)必須等於True(對象obj必須屬於類type,直接、間接或虛擬均可),如果該參數為類(例如:super(type, type2))則issubclass(type2, type)必須等於True(類type2必須是類type的子類,直接、間接或虛擬均可),如填寫一般為self。

返回當前super()函數的類和對象信息(type和object-or-type),例如:<super: <class 'C'>, <D object>>,一般都是直接調用函數,不需要返回值。

3. 實例解析

3.1 實例1 – 單繼承

代碼:

#聲明A類
class A:
def __init__(self):
self.n = 2

def plus(self, m):
print('當前對象是 {} 來自 A類的plus方法'.format(self))
#這裡的self.n並不是A類的self.n,而是B類的self.n。因為super()第2個參數是調用者的self。
self.n += m

#聲明B類,繼承A類
class B(A):
def __init__(self):
self.n = 3

def plus(self, m):
print('當前對象是 {} 來自 B類的plus方法'.format(self))
#調用A類的plus方法
super().plus(m)
self.n += 3

#實例化B類
b = B()

#調用B類的plus方法
b.plus(2)

#打印B類的n屬性
print(b.n)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部