Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我使用super()正确吗?_Python_Oop_Inheritance_Super - Fatal编程技术网

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将找到自己将调用的实际函数。在这种情况下,它是父类,但当涉及多重继承时,可能不是这种情况。

从子类方法调用超类构造函数是一种。。。好主意。谢谢你。。。你能提供一个简单的例子,从第二类使用超级?明白了。很好的例子,很好的解释。它终于成功了。