我有兩個共享方法名稱的父類。我想對它們進行子類化,并將它們的方法以不同的名稱重新分配給子類。這變得很復雜,因為這些方法也使用其他具有共享名稱的方法。人為但最小的例子:
class Foo1():
def __init__(self):
super().__init__()
def print(self):
print(self.get())
def get(self):
return 1
class Foo2():
def __init__(self):
super().__init__()
def print(self):
print(self.get())
def get(self):
return 2
class Foo(Foo1, Foo2):
def __init__(self):
super().__init__()
self.print1 = super().print
self.print2 = super(Foo1, self).print
foo = Foo()
foo.print1()
>>> 1
foo.print2()
>>> 1
在上面的示例中, foo.print1() 按預期列印 1,但 foo.print2() 列印 1 而不是 2。我想構造 Foo 使其呼叫 Foo2 的 print 和 get 方法,從而列印 2。
我理解這是因為名稱“self”實際上指向 Foo(),因此方法“print”和“get”指向 Foo1 的方法,因為 Foo1 是 MRO 中的第一個。
對于我的用例,Foo() 甚至沒有“print”和“get”方法,只有“print1”和“print2”。這讓我懷疑我做錯了一切。有沒有更好的方法來構造一個從 Foo1 和 Foo2 正確繼承這些方法的子類?
uj5u.com熱心網友回復:
讓您的類包裝Foo1和Foo2實體,而不是使用多重繼承。
class Foo:
def __init__(self):
foo1 = Foo1()
foo2 = Foo2()
self.print1 = foo1.print
self.print2 = foo2.print
self.get1 = foo1.get
self.get2 = foo2.get
uj5u.com熱心網友回復:
一種選擇是使用組合,其中您的新類實體只是原始類的兩個實體的包裝器。您的方法將委托給適當實體的方法。
class Foo:
def __init__(self):
self.foo1 = Foo1()
self.foo2 = Foo2()
def print1(self):
return self.foo1.print()
def print2(self):
return self.foo2.print()
# etc
您也可以在類級別而不是實體級別執行組合。這僅在Foo1和Foo2方法的函式簽名與方法所需的簽名兼容時才有效Foo。
class Foo:
print1 = Foo1.print
print2 = Foo2.print
get1 = Foo1.get
get2 = Foo2.get
在任何一種情況下,您都必須定義Foo.__init__接受Foo1.__init__and 的任何必要引數Foo2.__init__,并確保將它們傳遞給正確的引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349383.html
