superpython
‘壹’ python,super(Bullet,self)是什么意思
Bullet的父类是Sprite,
super(Bullet,self).__init__() 的意思是初始化父类是python 2.7版本。在python 3中也可以简写为super().__init__()
当子类有构造函数的时候,继承父类后,如果想要调用父类的方法或者属性就需要在子类构造函数中初始化父类
如果子类没有新的构造函数,那么继承后就可以直接使用父类的方法或属性,而不需要在子类构造函数中重新初始化父类
‘贰’ python中super关键字的使用
案例一:单继承时super关键字的使用:
log:
解释:这里的慧穗扮super强制调用了父类的方法,不仅仅是__init__方法,也可以是强前灶制调用父类普通方法(如cry)
案例二:多继承时super的使用
先不看cry方法,只看__init__方法,原理都是一样的,这里的哈士奇和金毛都继承了Dog类,而杂交犬继承了金毛和哈士奇
看一下log:
虽然只创建了一个dog3对象,但是分别调用了Dog,Husky,Golden的__init__方法。
案列三:不使用super关键字,写一下多继承:
用父类直接族老调用自己的__init__方法
看一下log:
可以发现这里多打印了一句“普通狗狗的眼睛是黑色”,也就是说多调用了一次Dog()的__init__()方法
总结:所以super可以用来强制调用父类方法(包括__init__方法,和其他自定义方法),但是super可以避免多继承时重复调用父类方法。
‘叁’ python super()用法遇到TypeError: must be type, not classobj
第一关于
super().__init__()
这种不指定子类的继承方法是在Python 3中新加入的,因为你使用的是Python 2, 所以会报错。
第二,关于TypeError,请题主在定义两个父类的时候加入他们的父类(object),如下,再尝试一次,因为Python 2中的classobj不算做一种type,如果你用Python 3的话应该就没有这种问题了。
classBase1(object):
def__init__(self):
print"我是Base1"
classBase2(object):
def__init__(self):
print"我是Base2"
另外一点题外话,题主对Base这个子类采用了双重继承,即此子类同时拥有两个父类(Base1和Base2),这种继承方法有时容易造成混乱,即如果两个父类有相同的方法名或变量名时,无法确定应继承哪一个。因此在诸如Java等语言中多重继承是不允许的。Python允许多重继承,但在这种情况下为了避免混乱,Python会自动按顺序选择拥有所需方法名的第一个父类并执行,而忽略其他父类中的同名方法。比如你的
classBase(Base1,Base2):
def__init__(self):
super(Base,self).__init__()
中,使用
super(Base,self).__init__()
来呼叫Base父类的__init__方法,由于Base的父类有两个(Base1和Base2),并且两个都有__init__方法,所以Python默认只按顺序呼叫Base1的__init__方法而忽略Base2的。这样你运行
bbbb=Base()
时就只会显示
我是Base1
而不会显示“我是Base2”。如果你要使用super()方法并希望像使用
classBase(Base1,Base2):
def__init__(self):
Base1.__init__(self)
Base2.__init__(self)
时一样同时输出“我是Base1”和“我是Base2”的话,你需要修改代码使Base2为Base1的子类,Base为Base2的子类才可以。如下:
classBase1(object):
def__init__(self):
print"我是Base1"
classBase2(Base1):
def__init__(self):
super(Base2,self).__init__()
print"我是Base2"
classBase(Base2):
def__init__(self):
super(Base,self).__init__()
这样你运行
bbbb=Base()
时才会输出
我是Base1
我是Base2
‘肆’ Python请问以下代码类名中的(list)和方法中的super是什么意思
super是父类,也就是list
‘伍’ python中的super()是什么意思呢
super就是在子类中调用父类方法时用的。
classFooParent(object):
def__init__(self):
self.parent='I'mtheparent.'
print'Parent'
defbar(self,message):
printmessage,'fromParent'
classFooChild(FooParent):
def__init__(self):
super(FooChild,self).__init__()#调用父类初始化方法
print'Child'
defbar(self,message):
super(FooChild,self).bar(message)#调用父类bar方法
print'Childbarfuction'
printself.parent
if__name__=='__main__':
fooChild=FooChild()
fooChild.bar('HelloWorld')
如果解决了您的问题请采纳!
如果未解决请继续追问
‘陆’ python多重继承下super问题
楼上的回答的很正确,简单来说:在对类D进行实例化的时候,你依次对类C和类A进行了初始化,结果就会以后初始化的B为准了
实际上在子类里并不需要去初始化父类,你在实例化子类的同时,继承自父类的对象都会被创建
classA(object):
def__init__(self):
self.a=1
classB(A):
def__init__(self):
self.a=2
self.b=2
classC(B,A):
pass
>>> c = C()
>>> c.a
>>> 2
另外补充一下。父类为新式类的情况下,继承顺序是有影响的。继承顺序上,经典类是深度优先,新式类是广度优先,两种混用的话,分分钟就晕乎了。可以去多做做实验,好好了解。
‘柒’ 使用python的super时出现的TypeError: must be type, not classobj 原因及解决
示例如下:
但是运行报错:TypeError: must be type, not classobj
查找资料之后发现,python中super只能应用于袜拿睁新类,而不能应用于经典类
所谓新类 : 就是所有类都必须要有继承的类,如果什么都不想继承,就继承到告岁object类。下面是一个新类的例子
所谓经典类 : 就是什么都不用继承的类,例如:
产上上面的问题,而自己又不知道父类该继承什么,最简单的方法就是让它去继承object类敏谈,例如:
‘捌’ python中super为什么能解决多重继承问题
1. super 并不是一个函数,是一个类名,形如 super(B, self) 事实上调用了 super 类的初始化函数,产生了一个 super 对象;
2. super 类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
3. super(B, self).func 的调用并不是用于调用当前类的父类的 func 函数;
4. Python 的多继承类是通过 mro 的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数只调用一次(如果每个类都使用 super);
5. 混用 super 类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一个父类函数被调用多次。
6. 用 super,遇到修改父类的名字时等情况
‘玖’ python中super()函数的意义,最好浅显易懂,以及用法,谢谢
调用父类, 和parent一个意思. 只不过python使用的继承方式有点特别, 所以用起来有点特别
php"><?php
classA
{
functionhello()
{
print"A ";
}
}
classSonOfA
{
functionhello()
{
parent::hello();
}
}
那么在python里就是通过 super(A, self) 获得指向父类的指针(当成指针好了), 然后调用hello.
super(A,self).hello()#相当于呼叫A的hello
#据说python3,可以
super().hello()