我正确使用super()吗?

Lou*_*s93 6 python oop inheritance super

我做了一小部分代码因为我还在试图弄清楚使用的具体细节super().为什么这个块会运行到这个TypeError

 a = SecondClass()
TypeError: __init__() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

然后,该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()
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 8

这与此无关super.你不定义__init__SecondClass明确的-但是,因为它是从继承FirstClass,它继承FirstClass__init__.因此,如果不传入value参数,则无法实例化对象.

编辑确定.正如其他人所提到的,第一点是你必须始终在超级调用中使用当前类,而不是超类 - 在这种情况下super(SecondClass, self).那是因为super意味着"获取类x的父级",所以显然你的意思是"获得SecondClass的父级" - 这是FirstClass.

第二点是在__init__内部调用方法没有意义meth.__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.
Run Code Online (Sandbox Code Playgroud)