【问题标题】:Am I using super() correctly?我正确使用 super() 吗?
【发布时间】:2011-09-26 03:49:18
【问题描述】:

我编写了一小段代码,因为我仍在尝试找出使用 super() 的细节。为什么这个块会跑到这个TypeError

 a = SecondClass()
TypeError: __init__() takes exactly 2 arguments (1 given)

然后,SecondClass.meth() 函数应该打印字符串,但我显然在概念上遗漏了一些东西。

class FirstClass (object):
    def __init__ (self, value):
        self.value = value
        print self.value

class SecondClass (FirstClass):
    def meth (self):
        super (FirstClass,self).__init__(value = "I am a strange string")

a = SecondClass()
a.meth()

【问题讨论】:

  • 从子类方法调用超类构造函数是一个... 有趣的想法。

标签: python oop inheritance super


【解决方案1】:

这与super 无关。您没有为SecondClass 显式定义__init__ - 但是,因为它继承自FirstClass,所以它继承FirstClass__init__。所以不传入value参数就无法实例化对象。

编辑好的。正如其他人所提到的,第一点是您必须始终在您的超级调用中使用 current 类,而不是超类 - 在本例中为 super(SecondClass, self)。那是因为 super 的意思是“获取 x 类的父级”,所以显然您的意思是“获取 SecondClass 的父级”——即 FirstClass。

第二点是在meth内部调用__init__方法没有意义。 __init__ 在实例化对象时已经被调用。要么你的子类定义了自己的版本,可以选择是否调用自己的超级方法;或者,在这种情况下,它不会,在这种情况下,超类的版本会被自动调用。

让我重复一遍,因为我怀疑这是您理解中缺少的部分:子类化的全部意义在于,任何您没有特别覆盖的东西,无论如何都会被继承。 super 适用于您想要覆盖某些内容但仍使用超类中的逻辑的情况以及

所以这是一个愚蠢的例子:

class FirstClass(object):
    def __init__ (self, value="I am the value from FirstClass"):
        print value

    def meth(self):
        print "I am meth from FirstClass"

    def meth2(self):
        print "I am meth2 from FirstClass"

class SecondClass(FirstClass):
    def __init__ (self):
        print "I am in SecondClass"
        super(SecondClass, self).__init__(value="I am the value from SecondClass")

    def meth(self):
        print "I am meth from SecondClass"


a=FirstClass() # prints "I am the value from FirstClass"
b=SecondClass() # prints *both* "I am in SecondClass" *and* "I am the value from SecondClass

a.meth() # prints "I am meth from FirstClass"
b.meth() # prints "I am meth from SecondClass"

a.meth2() # prints "I am meth2 from FirstClass"
b.meth2() # *also* prints "I am meth2 from FirstClass", because you didn't redefine it.

【讨论】:

  • 谢谢...您能否提供一个使用第二类 super 的简单示例?
  • 明白了。很好的例子,很好的解释。终于成功了。
【解决方案2】:

super()的第一个参数应该是当前类,而不是父类:

class SecondClass(FirstClass):
    def meth(self):
        super(SecondClass, self).__init__(value="I am a strange string")

Python 会找到自己调用的实际函数。在这种情况下,它是父类,但在涉及多重继承时可能不是这种情况。

【讨论】:

    【解决方案3】:

    修复meth功能

    class SecondClass (FirstClass):
        def meth (self):
            super (SecondClass,self).__init__(value = "I am a strange string")
    

    【讨论】:

      【解决方案4】:

      应该是

      super(SecondClass, self)
      

      python documentation on super()

      【讨论】:

        【解决方案5】:

        SecondClass 的代码应该是这样的:

        class SecondClass (FirstClass):
            def meth (self):
                super (SecondClass,self).__init__(value = "I am a strange string")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-28
          • 2015-06-25
          • 2022-01-08
          • 2011-08-07
          • 2019-05-03
          • 2016-03-12
          • 1970-01-01
          相关资源
          最近更新 更多