为什么在 Python 中父级的 init 调用子级的重写方法?[复制]

Why in Python the parent's init calls child's overridden method? [duplicate]

提问人:Ashark 提问时间:11/18/2023 更新时间:11/18/2023 访问量:31

问:

我有两个班级。子项具有不同的签名(参数数)。看看这个 MRE(最小可重复的例子):

class Parent:
    def __init__(self, arg):
        self.some_method(arg)  # it was intended to call the Parent's some_method
    
    def some_method(self, arg1):  # why this method is not called from Parent's __init__?
        print(f"Parent method called with arg1: {arg1}")


class Child(Parent):
    def __init__(self):
        Parent.__init__(self, "Hello")
        # the child __init__ does not need to call some_method
    
    def some_method(self, arg1, arg2):  # child has two arguments. Why Child's some_method called from Parent's __init__?
        print(f"Child method called with arg1: {arg1} and arg2: {arg2}")
        super().some_method(arg1)


child = Child()  # getting an exception

预期结果:

Parent method called with arg1: Hello

实际结果:

TypeError: Child.some_method() missing 1 required positional argument: 'arg2'

可以看出,它被称为 Child.some_method()。

为什么会这样?是否可以保留不同数量的参数并使其正常工作?


有一个类似的问题,但它的意图与我的相反——他希望父方法称为子方法。

蟒蛇 哎呀

评论

0赞 Woodford 11/18/2023
也相关(并在上面的问题中链接):stackoverflow.com/questions/6620832/......

答:

0赞 Ashark 11/18/2023 #1

发生这种情况是因为在 init 的 Parent 类中,self 指向 Child 对象,而不是 Parent 对象。

为了解决这个问题,Parent 类应该显式调用它自己的some_method

class Parent:
    def __init__(self, arg):
        Parent.some_method(self, arg)  # always will call Parent's some_method()

评论

0赞 Jean-François Fabre 11/18/2023
是的,它之所以这样做,是因为名称“some_method”被重新分配给默认值,即在继承 Parent 类时位于 Child 中。
0赞 Woodford 11/18/2023
参数(您省略的)内部将有相同的问题,并且更多事情可能会以相同的方式中断。selfParent.some_method
0赞 jsbueno 11/18/2023
@Woodword 虽然对这个答案有一些评论,但像现在这样在调用中明确包括不会有同样的问题:这将调用类中定义的方法。当然,这里需要的是有人来指导 O.P. 如何工作面向对象编程和继承,任何不这样做的答案都只是在玩弄。selfParent