我希望能够从父类中循环使用该父类中的第二个方法的方法。但是,在子类中重写了第二种方法。我希望回收的父方法在从子类调用时使用新的重写的第二个方法。我希望它如何工作的一个例子有望使这更清楚:
class Parent:
def method1(self, num):
return num**2
def method2(self, list_size):
return [self.method1(i) for i in range(list_size)] #List of squares
class Child(Parent):
def method1(self, num): #Overrides corresponding parent method
return num**3
def method2(self, list_size):
return super().method2(list_size) #Returns a list of cubes using child's method 1.
在python3中这可能吗?或者调用父方法2也使用父方法1?我希望重用父类的大部分,因为子类只有几个方面不同。像父类一样嵌套的方法使它更加通用。
谢谢!
编辑:我忘了用简单的代码测试它!如果有人想知道它确实像我想的那样工作!
是的,这可以按照你想要的方式工作。
您可以自己轻松测试。除非你只传递0和1,否则它们是否会变得平方或立方是非常明显的。
并且,在不太明显的情况下,只需将调试器断点添加到Child.method1
和Parent.method1
,看看哪一个被击中。或者将print(f'Child1.method({self}, {num})')
添加到方法中,看看它是否被打印出来。
如果你来自另一种使用C ++ OO语义而不是Smalltalk OO语义的语言,那么以这种方式思考它可能会有所帮助:每个方法总是虚拟的。
__init__
是虚拟的吗?是。__init__
期间调用一个方法怎么办?是。super
电话中调用一个方法怎么办?是。@classmethod
?是。唯一的例外是当你明确告诉Python不要进行虚函数调用时:
super()
的调用使用了MRO链中下一个类的实现,因为这是super
的重点。Parent.method1(self, num)
一样,你显然得到Parent.method1
,因为这是绑定方法的全部要点。如果你不是想用Java来理解Python,只是想要用自己的术语更深入地理解Python,你需要了解的是当你调用self.method1(i)
时会发生什么。
首先,self.method1
不知道或不关心你会打电话给它。这是一个属性查找,就像self.name
那样。
Python解析这个问题的方法在Descriptor HOWTO中有描述,但过度简化的版本如下所示:
self.__dict__
有没有名为method1
的东西?没有。type(self).__dict__
有没有名为method1
的东西?是。
返回type(self).__dict__['method1'].__get__(self)
。如果第二次查找失败,Python将遍历type(self).mro()
并对每个查找执行相同的测试。但在这里,这没有出现。 type(self)
总是将Child
作为Child
的一个例子,并且Child.__dict__['method1']
存在,因此它将Child.method
绑定到self
,结果是self.method1
的意思。
简短回答:是的。刚尝试了一些带有打印的代码略微修改过的版本。
class Parent:
def method1(self):
print("Parent method1")
def method2(self):
print("Parent method2")
self.method1()
class Child(Parent):
def method1(self):
print("Child method1")
def method2(self):
print("Child method2")
super().method2()
c = Child()
c.method2()
这是输出:
Child method2
Parent method2
Child method1
如您所见,使用的方法1是子方法。