导航:首页 > 编程语言 > pythonsuper使用

pythonsuper使用

发布时间:2022-11-29 18:39:40

A. python中的Super详解

这篇文章我们来介绍一下 super,我相信大部分的人使用 super 都是使用这种方式;

在我们常用 super 的时候都通常会认为 super 是一个方法或者函数,但是实际上 super 是一个正儿八经的 class,它是一个内置内的名字,然后 super() 并不是调用了一个函数 ,super() 是建立 了一个 super 的对象

尽管我们更常用的是 super() 括号里面什么都没有,但是 super 的完整版它里面应该是有两个参数,第一个参数是一个 type 也就是一个 class,第二个参数是一个 type 或者是一个 object,其中第二个参数决定了这一个函数绑定到那个 object 或者 class 上,同时第二个参数决定了使用那个 mro,而第一个参数决定了在 mro 链上 从哪个class 开始往后找,例如;

那么这个 super(Male, self) 它是做了这样一个事情,首先它要从 self 这个 object 里面拿到 mro,然后他会找到第一个 argument,也就是 Male 在 mro 里所处的位置,那在当前的情况下 Male 就是最开始的那个(Male Person object)接下来他会从 Male 后面的那个 class 开始找,那它第一个找到的就是 Person,然后它就看Person 里面有没有 __init__ 这个函数,然后发现有这个函数,然后它在把这个 __init__ 绑定到 self 上,在这里可以理解为这个 Person 的 __init__ 函数传进去的这个 self 就是 super 里面的这个 self,也就是说 Person.__init__(self,name) 这行代码等价于 super(Male, self).__init__(name) 这行代码。

至于为什么不直接使用 Person.__init__(self,name) 是有几个原因:

在来看这个示例:

如果在 Male 中正常的使用它 super(Male, self).__init__(age, name) ,那么它就会正常的初始化所有的东西,它会访问这个 Person 的 __init__ ,然后 Person 的 __init__ 会访问 Animal 的 __init__ ,最后就完成了这个 Male。

那如果把它改成 super(Person, self).__init__(age, name) ,那么就会报错,因为当我们使用 super(Person, self) 的时候,self 的 mro 链是 Male Person Animal 然后是 object,那第一个参数它由于是 Person,所以他会从 Person 后面的那个 class 也就是 Animal 开始找,那 Animal 是有 __init__ 函数的,但是 Animal 的 __init__ 只有一个参数 age,所以当我们传入 age name 的时候那就错了,这时候就只需要将它改成只传进去一个 age 如: super(Person, self).__init__(age) 就可以了,同时也跳过了 Person。

super 并不是只能在 class 里面使用的,它可以在任何一个地方使用,我只要给定 第二个参数 object 或者 class ,在给定第一个参数从哪里开始找,我就能使用它的函数,例如:

文章来自https://www.cnblogs.com/XiaoYang-sir/p/16156355.html

B. 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

C. python中super的使用

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

super().__init__(name,has_wife)
阅读全文

与pythonsuper使用相关的资料

热点内容
华为智慧屏app怎么连接电视 浏览:597
服务器如何计米数 浏览:220
62256与单片机 浏览:734
python后端开发博客 浏览:618
java动态数组定义 浏览:988
各大网站的服务器地址 浏览:370
服务器连接不到因特网什么意思 浏览:741
如何在文件夹中显示页码 浏览:354
云服务器登不上qq 浏览:421
程序员四级工程师 浏览:719
薄荷app怎么把体重清零 浏览:644
草料二维码加密怎么制作 浏览:853
04s519隔油池图集pdf 浏览:243
程序员搞测试 浏览:554
苹果app应用隐藏了怎么办 浏览:660
PDF调取 浏览:201
独立柱加密需要什么条件 浏览:814
php培训出来找不到工作 浏览:106
小程序克隆源码 浏览:448
python整数整除负数 浏览:880