[英]Python Class Inheritance Prevent Parent Class from Calling Child Class Method
您好,我想使用一個需要多個參數以及來自類的屬性的類方法__init__()
。
但是,因為我必須多次調用此調用,所以我想避免為每個調用提供多個參數。 因此,我想創建一個提供如下參數的子類。 但是,我不想覆蓋子類中的父方法。
這是帶有示例調用的兩個類:
class Parent:
def __init__(self, parent_arg: dict) -> None:
self.parent_arg = parent_arg
def create_child(self, child_arg):
return Child(child_arg, self.parent_arg)
def method_a(self, method_arg: str, child_arg: str) -> dict:
self.method_b(method_arg, child_arg)
def method_b(self, method_arg: str, child_arg: str) -> str:
print(f"{self.parent_arg}, {child_arg}, and {method_arg}")
class Child(Parent):
def __init__(self, child_arg: str, parent_arg: dict) -> None:
super().__init__(parent_arg)
self.child_arg = child_arg
def method_a(self, method_arg: str = None) -> dict:
return super().method_a(method_arg, self.child_arg)
def method_b(self, method_arg: str) -> str:
return super().method_b(method_arg, self.child_arg)
if __name__ == "__main__":
parent_instance = Parent(parent_arg="Parent Argument")
child_instance = parent_instance.create_child(child_arg="Child Argument")
child_instance.method_a(method_arg="Method Argument")
同樣,我希望能夠從Parent
和Child
實例調用相同的方法名稱。 但是,我希望在父類方法中完成計算。 非常感謝您提供的所有幫助。
這是一個沒有繼承的解決方案,但是,我很好奇是否有更優雅的解決方案。
class Child:
def __init__(self, child_arg: str, parent_arg: dict) -> None:
self.parent = Parent(parent_arg)
self.child_arg = child_arg
def method_a(self, method_arg: str = None) -> dict:
return self.parent.method_a(method_arg, self.child_arg)
def method_b(self, method_arg: str) -> str:
return self.parent.method_b(method_arg, self.child_arg)
我認為您正在尋找的答案是不要覆蓋Child
類中的method_b
。
當您調用super()
時,您可能會認為執行“轉到”父級,這是不對的。 你一直“在”同一個對象( self
)。 如果您從子定義中簡單地省略method_b
,則child_instance.method_b
的值將是父定義。
基本上,僅當您要實現其他或不同的行為時,才在子級中覆蓋這些方法。
根據 OP 的評論進行編輯
看看這個。 它允許您在創建對象時為其分配屬性,因此您可以重復使用它們,而不必在每次方法調用時都提供它們。 它實現了Parent
,因此它不知道/不關心Child
。 Child
所做的只是覆蓋這些方法,以便它可以使用額外的child_arg
參數。
class Parent:
def __init__(self, parent_arg: str) -> None:
self.parent_arg = parent_arg
def method_a(self, method_arg: str) -> None:
self.method_b(method_arg)
def method_b(self, method_arg: str) -> None:
print(f"self.parent_arg: {self.parent_arg}")
print(f"method_arg: {method_arg}")
class Child(Parent):
def __init__(self, child_arg: str, parent_arg: str) -> None:
super().__init__(parent_arg)
self.child_arg = child_arg
def method_a(self, method_arg: str) -> None:
super().method_a(method_arg)
def method_b(self, method_arg: str) -> None:
print(f"self.parent_arg: {self.parent_arg}")
print(f"self.child_arg: {self.child_arg}")
print(f"method_arg: {method_arg}")
if __name__ == "__main__":
parent_instance = Parent(parent_arg="Parent Argument")
print("parent_instance calling a:")
parent_instance.method_a("Method Argument")
print("child_instance calling a:")
child_instance = Child(
child_arg="Child Argument",
parent_arg="Parent Argument",
)
child_instance.method_a("Method Argument")
如果您不想調用孩子的方法,請直接從特定類調用方法,而不是通過self.methodname
。
def method_a(self, method_arg: str, child_arg: str) -> dict:
return Parent.method_b(self, method_arg, child_arg)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.