Python 我使用super()正确吗?
我编写了一小段代码,因为我仍在尝试了解使用Python 我使用super()正确吗?,python,oop,inheritance,super,Python,Oop,Inheritance,Super,我编写了一小段代码,因为我仍在尝试了解使用super()的细节。为什么此块会运行到此TypeError a = SecondClass() TypeError: __init__() takes exactly 2 arguments (1 given) 然后,SecondClass.meth()函数应该打印字符串,但我显然在概念上遗漏了一些东西 class FirstClass (object): def __init__ (self, value): self.v
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()
SecondClass的代码应如下所示:
class SecondClass (FirstClass):
def meth (self):
super (SecondClass,self).__init__(value = "I am a strange string")
应该是
super(SecondClass, self)
请参见这与
super
无关。您没有为第二类
明确定义初始
,但是,由于它继承自第一类
,因此它继承了第一类
。因此,如果不传入值
参数,就无法实例化对象
编辑确定。正如其他人所提到的,第一点是在超级调用中必须始终使用当前类,而不是超类-在本例中是super(SecondClass,self)
。这是因为super的意思是“得到x类的父类”,所以很明显你的意思是“得到第二类的父类”——也就是第一类
第二点是,在meth
中调用\uuuu init\uuuu
方法没有意义<代码>\uuuu init\uuuu在实例化对象时已被调用。您的子类定义了自己的版本,可以选择是否调用自己的超级方法;或者,在本例中,它没有,在这种情况下,会自动调用超类的版本
让我重复一遍,因为我怀疑这是您理解中缺失的部分:子类化的全部要点是,您没有特别重写的任何内容都会被继承super
仅适用于您希望重写某些内容,但仍然使用来自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.
固定方法函数
class SecondClass (FirstClass):
def meth (self):
super (SecondClass,self).__init__(value = "I am a strange string")
super()的第一个参数应该是当前类,而不是父类:
class SecondClass(FirstClass):
def meth(self):
super(SecondClass, self).__init__(value="I am a strange string")
Python将找到自己将调用的实际函数。在这种情况下,它是父类,但当涉及多重继承时,可能不是这种情况。从子类方法调用超类构造函数是一种。。。好主意。谢谢你。。。你能提供一个简单的例子,从第二类使用超级?明白了。很好的例子,很好的解释。它终于成功了。