Python:从子方法调用父方法内的子方法

问题描述 投票:0回答:2

我希望能够从父类中循环使用该父类中的第二个方法的方法。但是,在子类中重写了第二种方法。我希望回收的父方法在从子类调用时使用新的重写的第二个方法。我希望它如何工作的一个例子有望使这更清楚:

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?我希望重用父类的大部分,因为子类只有几个方面不同。像父类一样嵌套的方法使它更加通用。

谢谢!

编辑:我忘了用简单的代码测试它!如果有人想知道它确实像我想的那样工作!

python python-3.x inheritance
2个回答
1
投票

是的,这可以按照你想要的方式工作。

您可以自己轻松测试。除非你只传递0和1,否则它们是否会变得平方或立方是非常明显的。

并且,在不太明显的情况下,只需将调试器断点添加到Child.method1Parent.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,因为这是绑定方法的全部要点。
  • 如果你深入研究类dicts并手动运行描述符协议,你显然可以手动完成任何操作。

如果你不是想用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的意思。


1
投票

简短回答:是的。刚尝试了一些带有打印的代码略微修改过的版本。

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是子方法。

© www.soinside.com 2019 - 2024. All rights reserved.