所以我有兩個類,其中一個繼承自另一個并覆寫所有父方法:
class Parent:
def name(self):
return 'parent'
def run(self):
print(f'calling method from parent: I am {self.name()}')
class Child(Parent):
def name(self):
return 'child'
def run(self):
print(f'calling method from child: I am {self.name()}')
return super().run()
為子級和父級運行以下片段Child().run()觸發方法,輸出為:run
calling method from child: I am child
calling method from parent: I am child
結果很清楚——因為我們重新定義了方法name,所以兩種方法都使用了新版本run。(I am child在兩條線上)
這是主要問題 - 我希望它的作業方式是讓 parentrun方法使用 parent name。
到目前為止我所做的是替換super為self.__class__.__mro__[1],因此該方法看起來像
def run(self):
print(f'calling method from child: I am {self.name()}')
return self.__class__.__mro__[1]().run()
它的作業方式是使用方法決議順序獲取父類并創建父類的實體。它作業正常,現在結果是:
calling method from child: I am child
calling method from parent: I am parent
但我不喜歡這個解決方案:
- 單一繼承——因為我們硬編碼父類索引,我們不能讓它與多個父類一起作業
- 在這種情況下使用 MRO 感覺不合適
- 在這里我們假設
__init__不接受額外的引數
我認為線索在于更改self.name父方法,以便顯式使用父方法,但我不知道如何實作這一點。
uj5u.com熱心網友回復:
您可以使用以下命令找到定義該方法的當前類__class__:
class Parent:
def name(self):
return 'parent'
def run(self):
print(f'calling method from parent: I am {__class__.name(self)}')
uj5u.com熱心網友回復:
我建議創建name一個類私有的 name-mangled ( __) 屬性:
class Parent:
__name = 'parent'
def run(self):
print(f'calling method from parent: I am {self.__name}')
class Child(Parent):
__name = 'child'
def run(self):
print(f'calling method from child: I am {self.__name}')
return super().run()
Child().run()
# calling method from child: I am child
# calling method from parent: I am parent
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/484674.html
標籤:Python python-3.x 遗产
