关于继承:如何在Python中引用父方法?

how to refer to a parent method in python?

本问题已经有最佳答案,请猛点这里访问。

假设我有两个类(一个是父类,一个是子类)。如果在子类中定义的方法也不同,如何在父类中引用该方法?

代码如下:

1
2
3
4
5
6
7
8
class A:
    def __init__(self, num):
        self.value=num
    def f(self, num):
        return self.value+2
class B(A):
    def f(self, num):
        return 7*self.f(num)

在最后一行中,我想用"self.f(num)"命令引用父类A,而不是用B中的方法本身来创建无限递归。提前谢谢。


使用super

1
return 7 * super(B, self).f(num)

或者在python 3中,它只是:

1
return 7 * super().f(num)


如果您知道要使用,也可以通过以下方式显式引用:

1
2
3
class B(A):
    def f(self,num):
        return 7 * A.f(self,num)

记住,必须显式地将自变量赋给成员函数a.f()。


与其他答案一致,有多种方法可以调用超级类方法(包括构造函数),但是在python-3.x中,过程被简化了:

Python 2.x

1
2
3
4
5
6
7
8
class A(object):
 def __init__(self):
   print"world"

class B(A):
 def __init__(self):
   print"hello"
   super(B, self).__init__()

Python 3.x

1
2
3
4
5
6
7
8
class A(object):
 def __init__(self):
   print"world"

class B(A):
 def __init__(self):
   print"hello"
   super().__init__()

根据文件,super()现在等同于super(, self)


为什么不简单一点?

1
2
3
class B(A):
    def f(self, num):
        return 7 * A.f(self, num)

1
2
3
class B(A):
    def f(self, num):
        return 7 * super(B, self).f(num)

从python的子类调用父类的方法时检查我的答案?.

这对这里的其他人来说是一个轻微的扭曲(不使用super)。


你可以使用super,或者如果你可以更明确地做类似的事情。

1
2
3
class B(A):
  def f(self, num):
    return 7 * A.f(self, num)