繁体   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