pythonsuper继承
⑴ python super().init()作用
对于python里的super(). init ()有什么作用,很多同迟余学没有弄清楚。
直白的说super(). init (),就是继承父类的init方法,同样可以使用super()点 其他方法名,去继承其他方法。
下面通过三个不同的继承猜侍并码兆滚调用,对比他们的区别,搞清楚super(). init ()的用途。
文章摘自: https://blog.csdn.net/a__int__/article/details/104600972
⑵ 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可以避免多继承时重复调用父类方法。
⑶ 11.详解python中super()函数原理及常用实例
type--类,object-or-type--类,一般是self
运行发现:super().add(x) 与A.add(self,x)执行结果一致;但涉及多继承,发现super()只衫漏调用一次
在super机制里可以保证公共父类仅被执行一次,至于执行的顺序嫌旅,是按照MRO(Method Resolution Order):方法解析顺序 进行的
super()可以调用父类中的任何方法,超(父类的父类)类的任何方法;可重写父类同名的 init 函数,及其他方法
在任何时候继承类和重写方法的,我或者烂们应当用到args, kwargs将接收到的位置参数和键值参数给父类方法
⑷ 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是什么-
目录
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时出现的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,遇到修改父类的名字时等情况
⑻ Python3中的super()函数
super()函数碧亩冲的用处是调用当前类的父类函数。在要调用父类的函数之外,还需要加一点别的操作的时候,特别有用。
例:
结果是:
上面是单继承的例子,用super()而悔歼不是直接用父类的名字去调用父类函数的好处是耐谈不用管父类的名字。即使父类改名了,super()的调用依然有效。
多重继承的时候需要根据MRO来决定调用顺序。详见官方文档:
⑼ 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类继承自object为什么要super自己的方法
super不是指向父类, 而是指向mro中的下一个类, 所以你继承的这个mixin子类, 他会去继承另外一个类, 源码里面是ListView, 所以super返回的是ListView.
class A(object):
def __init__(self):
print(self.__class__.__mro__)
def bark(self):
print("I'm A")
super(A, self).bark()
class B(object):
def bark(self):
print("I'm B")
class C(A, B):
def bark(self):
print("I'm C")
super(C, self).bark()
if __name__ == '__main__':
c = C()
c.bark()
运行结果:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'objec
t'>)
I'm C
I'm A
I'm B
因为源码里面是
class IndexView(BaseMixin,ListView):
所以BaseMixin里面调用的super(BaseMixin, self).get_context_data(**kwargs), 实际上是调用的ListView的方法