如何在python中引用父方法?

use*_*042 29 python polymorphism inheritance

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

这是代码:

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)
Run Code Online (Sandbox Code Playgroud)

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

tza*_*man 38

用途super:

return 7 * super(B, self).f(num)
Run Code Online (Sandbox Code Playgroud)

或者在python 3中,它只是:

return 7 * super().f(num)
Run Code Online (Sandbox Code Playgroud)

  • @ user1111042:让我猜 - 您使用的是Python 2.x?然后你的_class A_应该从_object_继承,然后才会得到一个新的样式类.新样式类是类_type_的实例,而旧样式类只是_classobj_的实例._super()_仅适用于新样式类. (6认同)
  • 啊对.老式的课,我忘记了.你应该真正将A定义为`A类(对象)`,之后这将起作用. (3认同)

jim*_*iki 33

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

class B(A):
    def f(self,num): 
        return 7 * A.f(self,num)
Run Code Online (Sandbox Code Playgroud)

记住你必须明确地给成员函数Af()提供self参数


Aid*_*mez 6

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

Python的2.X

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super(B, self).__init__()
Run Code Online (Sandbox Code Playgroud)

Python的3.X

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super().__init__()
Run Code Online (Sandbox Code Playgroud)

super()现在相当于super(<containing classname>, self)该文档.