【问题标题】:how to refer to a parent method in python? [duplicate]如何在python中引用父方法? [复制]
【发布时间】:2012-03-09 23:36:18
【问题描述】:

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

代码如下:

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 中会创建无限递归的方法本身。提前谢谢你。

【问题讨论】:

    标签: python inheritance polymorphism


    【解决方案1】:

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

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

    请记住,您必须将 self 参数显式地提供给成员函数 A.f()

    【讨论】:

    • 当我尝试调用一个在 C 中实现的方法时,我在执行此操作时出错。它期望 A 的实例作为第一个参数并且没有将 B 识别为子类。我想使用 super() 可能会解决这个问题,但我还不确定。
    【解决方案2】:

    使用super:

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

    或者在 python 3 中,它只是:

    return 7 * super().f(num)
    

    【讨论】:

    • 这在理论上是正确的,但由于某种原因,我得到:TypeError: super() argument 1 must be type, not classobj
    • @user1111042:让我猜猜——你使用的是 Python 2.x?那么你的 class A 应该继承自 object,然后你才会得到一个新的样式类。新样式类是类 type 的实例,而旧样式类只是 classobj 的实例。 super() 仅适用于新样式类。
    • 是的,我正在使用 Python 2.x 和你所说的 super 在 2.x 中不起作用
    • 哦,对了。老式的课程,我忘了。您确实应该将 A 定义为 class A(object),之后这将起作用。
    【解决方案3】:

    与其他答案一致,有多种方法可以调用超类方法(包括构造函数),但是在 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__()
    

    Python-3.x

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

    super() 现在等同于super(<containing classname>, self),根据the docs

    【讨论】:

      【解决方案4】:

      为什么不保持简单?

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

      【讨论】:

        【解决方案5】:
        class B(A):
            def f(self, num):
                return 7 * super(B, self).f(num)
        

        【讨论】:

          【解决方案6】:

          你可以使用 super 或者如果你可以更明确地做这样的事情。

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

          【讨论】:

            【解决方案7】:

            Call a parent class's method from child class in Python?查看我的回答。

            这里的其他一些(不使用 super)略有不同。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-09-09
              • 1970-01-01
              • 2012-09-17
              • 2011-02-04
              • 2011-09-06
              • 2019-01-15
              • 2022-01-18
              • 1970-01-01
              相关资源
              最近更新 更多