無處不看我每個人都在說super()是多麼偉大。但是,我傾向於不使用super(),因爲它使得一切都比我想象的複雜得多。我已經看到了一些使用super()的流行示例,但它們似乎從來沒有向基類構造函數中顯示傳遞位置所需的參數。使用超級vs靜態的Python調用基類
我知道Python中的菱形問題,而super()會阻止兩次調用base_base類。 (在這種情況下爲A類)
A類的構造函數被調用兩次這麼糟糕嗎? (即情況2)
下面是我對這兩種情況的代碼。
案例1:使用超()._ 初始化 _()
#abstractclass
class A(object):
#abstractmethod
def __init__(self, for_a, *args):
self.val_a = for_a
#abstractclass
class B(A):
#abstractmethod
def __init__(self, for_a, for_b, for_c):
super().__init__(for_a, for_c)
self.val_b = for_b
#abstractclass
class C(A):
#abstractmethod
def __init__(self, for_a, for_c):
super().__init__(for_a)
self.val_c = for_c
class D(B, C):
def __init__(self, for_a, for_b, for_c, for_d):
super().__init__(for_a, for_b, for_c)
self.val_d = for_d
class E(B):
def __init__(self, for_a, for_b, for_e, *args):
super().__init__(for_a, for_b, *args)
self.val_e = for_e
newobject1 = D(1, 2, 3, 4)
newobject2 = E(10, 11, 12, 0)
案例2:靜態 - 使用base._ 初始化 _(個體經營)
#abstractclass
class A(object):
#abstractmethod
def __init__(self, for_a):
self.val_a = for_a
#abstractclass
class B(A):
#abstractmethod
def __init__(self, for_a, for_b):
A.__init__(self, for_a)
self.val_b = for_b
#abstractclass
class C(A):
#abstractmethod
def __init__(self, for_a, for_c):
A.__init__(self, for_a)
self.val_c = for_c
class D(B, C):
def __init__(self, for_a, for_b, for_c, for_d):
B.__init__(self, for_a, for_b)
C.__init__(self, for_a, for_c)
self.val_d = for_d
class E(B):
def __init__(self, for_a, for_b, for_e):
super().__init__(for_a, for_b)
self.val_e = for_e
newobject1 = D(1, 2, 3, 4)
newobject2 = E(10, 11, 12)
然而'super'並不是對父類的基類的靜態調用的簡單替換。我會建議閱讀[超級考慮超級](https://rhettinger.wordpress.com/2011/05/26/super-considered-super/)和[Python的超級漂亮,但你不能使用它]( https://fuhm.net/super-harmful/)以獲得正確使用它的良好感覺。 – chepner