該代碼是不言自明的。我想同時呼叫類A和類B __init__方法。
代碼:
class A(object):
def __init__(self, name):
self.name = name
class B(object):
def __init__(self, age):
self.age = age
class C(A, B):
def __init__(self, name, age):
A.__init__(self, name)
B.__init__(self, age)
def display(self):
print(self.name, self.age)
c = C("xyz", 12)
c.display()
輸出:
xyz 12
我想使用super()而不是明確說明
A.__init__(self, name)
B.__init__(self, age)
我找不到任何相同的資源,需要幫助。
以下不起作用:
class A(object):
def __init__(self, name):
super(A, self).__init__()
self.name = name
class B(object):
def __init__(self, age):
super(B, self).__init__()
self.age = age
class C(A, B):
def __init__(self, name, age):
# A.__init__(self, name)
# B.__init__(self, age)
super(C, self).__init__(name, age)
def display(self):
print(self.name, self.age)
c = C("xyz", 12)
c.display()
uj5u.com熱心網友回復:
創建 的實體時C,最好傳遞關鍵字引數,以便您知道哪個是哪個。位置引數也適用,但使用關鍵字引數,您不必擔心弄亂引數的順序。
然后自C的推遲的定義self.name和self.age對父類,就立即通過所有引數了使用層次結構super().__init__(**kwargs)。關于繼承的最好的事情是子類甚至不需要知道它不處理的引數。第一個父類是A,所以self.name在那里定義。方法決議順序中的下一個父類是B,因此從A,您將剩余的關鍵字引數傳遞給B,super().__init__(**kwargs)再次使用。
class A(object):
def __init__(self, name, **kwargs):
self.name = name
super().__init__(**kwargs)
class B(object):
def __init__(self, age, **kwargs):
self.age = age
super().__init__(**kwargs) # this is actually not needed but in case you have other base classes after B, might come in handy
class C(A,B):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def display(self):
print(self.name, self.age)
c = C(name="xyz",age=12)
c.display()
輸出:
xyz 12
uj5u.com熱心網友回復:
一個簡單的解決方案是kwargs在所有初始化程式中使用,并傳遞您不關心的那些。
class A:
def __init__(self, name, **kwargs):
super().__init__(**kwargs)
self.name = name
class B:
def __init__(self, age, **kwargs):
super().__init__(**kwargs)
self.age = age
class C(A, B):
def __init__(self, name, age, **kwargs):
super().__init__(name=name, age=age, **kwargs)
def display(self):
print(self.name, self.age)
通過隔離您關心的引數kwargs,您可以確保kwargs在您點擊之前所有引數都被消耗掉object。
uj5u.com熱心網友回復:
為此,我在公共圖書館中創建了一個元類。設定第一個基類的元類。
它使任何繼承者自動呼叫它的 bases__init__而不必擔心super()呼叫允許您撰寫更清晰的代碼。它也很寬容,因為它將缺少的 args 設定為None.
from generallibrary import AutoInitBases
class A(metaclass=AutoInitBases):
def __init__(self,name):
self.name=name
class B:
def __init__(self,age):
self.age=age
class C(A,B):
def __init__(self,name,age):
pass
def display(self):
print(self.name,self.age)
c=C("xyz",12)
c.display()
xyz 12
我不太關心向后兼容性,所以如果你安裝它,請確保鎖定版本。它支持 python 3.8 和 3.9
pip install generallibrary==2.9.1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/385065.html
