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)
这与此无关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)