当前位置:首页 » 编程语言 » pythonsuper的用法

pythonsuper的用法

发布时间: 2022-12-16 12:20:27

‘壹’ python语句(具体如下)super的用法不理解,求大神指教!本人初学者,刚刚开始学习中。。。

super().xxx的作用是调用父类的xxx方法,在重写xxx方法时,这个方法的内容已经和原方法完全无关了,因此如果希望在重写之后仍然能执行原方法的逻辑,就需要使用super().xxx来调用父类的原方法。

‘贰’ python中super的使用

Yes, and since py3.5, `super(Man, self).__init__(name, has_wife)` can be replaced as below:

super().__init__(name,has_wife)

‘叁’ python,super(Bullet,self)是什么意思

Bullet的父类是Sprite,
super(Bullet,self).__init__() 的意思是初始化父类是python 2.7版本。在python 3中也可以简写为super().__init__()
当子类有构造函数的时候,继承父类后,如果想要调用父类的方法或者属性就需要在子类构造函数中初始化父类
如果子类没有新的构造函数,那么继承后就可以直接使用父类的方法或属性,而不需要在子类构造函数中重新初始化父类

‘肆’ python中的super是什么-

目录

python中的super,名为超类,可以简单的理解为执行父类的__init__函数。由于在python中不论是一对一的继承,还是一子类继承多个父类,都会涉及到执行的先后顺序的问题。那么本文就着重看下super的具体作用。

通过设计这样一个案例,我们可以明确super的前后逻辑关系:先定义一个父类 initial ,在这个父类中有参数值 param 和函数 func ,然后用子类 new 来继承父类 initial 。继承之后,在子类的 __init__ 函数中 super 执行的前后去打印参数值 param 和函数 func 的返回值,相关代码如下所示:

代码的执行结果如下所示:

首先我们注意到,父类 initial 中的 __init__ 函数内的打印语句,是在super之后才输出的,这说明了, super 函数是在执行父类的初始化操作。那么如果没有执行 super , new 子类对 initial 父类的继承体现在哪里呢?答案就是父类的成员函数,比如这样的一个案例:

其实就是删掉了子类中重载的成员函数,那么得到的结果如下:

可以发现在执行super之前就可以打印父类的 func 函数的函数值。所以python中继承的逻辑是这样的:

initial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.paraminitial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.param

也正是因为只有执行了 super 才能初始化父类中的成员变量,因此如果在super之前是无法访问父类的成员变量的。

本文通过一个python的实际案例的设计,来讲解python面向对象的技术——类的继承中必用的super函数的逻辑。其实我们可以把python中类的继承理解成这样的一个过程:当我们在括号中明确了父类时,其实已经引用了父类的成员函数,但是并没有执行父类的初始化函数。在执行子类的初始化函数的同时,会检查是否重载了父类的成员函数,如果重载则会直接覆盖。而只有在执行了super之后,才相当于执行了父类的初始化函数,此时才可以访问父类的成员变量。

本文首发链接为:https://www.cnblogs.com/dechinphy/p/super.html

作者ID:DechinPhy

更多原着文章请参考:https://www.cnblogs.com/dechinphy/

打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

‘伍’ python的类和对象中的super函数的问题

问题一
因为在B类中调用了super方法,所以没有执行完B类就去执行C类的程序
super方法在多重继承程序中的调用顺序,采用的是C3算法(在python3中)。
C3算法的规则如下

①.从底层开始,选择入边为零的点。

②.从左到右。

③深度探索。但受限于②规则。

每一个类都可以用mro函数查看自己的继承顺序(MRO全称Method Resolution Order,就是用来定义继承方法的调用顺序)

对于你的程序

分析

①规则。得到D类,去掉D类以后,入边为零的是B类和C类

②规则。选择B类,去掉B类后,入边为零的只有C类。结论是D–>B–>C–>A。

在d=D()语句前加print(D.mro()),就可以打印出D类的继承顺序

[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
问题二
python3的继承不同于普通的继承,super函数已经考虑到了重复继承的问题,所以对于A类只访问一次

‘陆’ 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中的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 c++怎么调用super

使用super()方法
super()方法的漂亮之处在于,你不需要在定义子类构造器时,明确的指定子类的基类并显式的调用,即不需要明确的提供父类,这样做的好处就是,如果你改变了继承的父类,你只需要修改一行代码(class代码行),而不需要在大量代码中去查找那个要修改的基类。另外一方面代码的可移植性和重用性也更高。
>>> class C(P):
... def __init__(self):
... super(C,self).__init__()
... print 'calling Cs construtor'
...
>>> c=C()

以上代码中P是C的父类。

‘玖’ Python中的super函数有什么用,怎么用 图片中的super中后面的参数代表啥

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。

你这里面super(SongBird,self).__init__()就相当于
Bird.__init__(self)

热点内容
算法实验分析 发布:2025-01-24 13:20:25 浏览:135
安卓和ios步数哪个准确 发布:2025-01-24 13:12:13 浏览:289
怎么给电脑换配置 发布:2025-01-24 13:04:04 浏览:920
如何修改服务密码10086 发布:2025-01-24 12:44:27 浏览:512
dosftp连接 发布:2025-01-24 12:35:56 浏览:802
编程来炒股 发布:2025-01-24 12:35:14 浏览:855
python正则中括号 发布:2025-01-24 12:32:08 浏览:585
配置排列用英语怎么说 发布:2025-01-24 12:32:00 浏览:608
led流水灯c语言程序 发布:2025-01-24 12:28:15 浏览:47
苹果平板锁屏密码在哪里 发布:2025-01-24 12:16:41 浏览:958