簡體   English   中英

Python類繼承防止父類調用子類方法

[英]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")

同樣,我希望能夠從ParentChild實例調用相同的方法名稱。 但是,我希望在父類方法中完成計算。 非常感謝您提供的所有幫助。

這是一個沒有繼承的解決方案,但是,我很好奇是否有更優雅的解決方案。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM