提问人:Ashark 提问时间:11/18/2023 更新时间:11/18/2023 访问量:31
为什么在 Python 中父级的 init 调用子级的重写方法?[复制]
Why in Python the parent's init calls child's overridden method? [duplicate]
问:
我有两个班级。子项具有不同的签名(参数数)。看看这个 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赞
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
参数(您省略的)内部将有相同的问题,并且更多事情可能会以相同的方式中断。self
Parent.some_method
0赞
jsbueno
11/18/2023
@Woodword 虽然对这个答案有一些评论,但像现在这样在调用中明确包括不会有同样的问题:这将调用类中定义的方法。当然,这里需要的是有人来指导 O.P. 如何工作面向对象编程和继承,任何不这样做的答案都只是在玩弄。self
Parent
评论