提高网站公信力 单仁,菲律宾菠菜网站开发,网站建设佰金手指科杰十七,专业定制网站建设哪里有super关键字的用法 一、概述二、作用三、语法四、使用示例1.通过super() 来调用父类的__init__ 构造方法#xff1a;2.通过supper() 来调用与子类同名的父类方法2.1 单继承2.2 多继承 一、概述
super() 是python 中调用父类#xff08;超类#xff09;的一种方法#xff0… super关键字的用法 一、概述二、作用三、语法四、使用示例1.通过super() 来调用父类的__init__ 构造方法2.通过supper() 来调用与子类同名的父类方法2.1 单继承2.2 多继承 一、概述
super() 是python 中调用父类超类的一种方法在子类中可以通过super()方法来调用父类的方法。 超类 是指 2层以上的继承关系假如 C类继承B类B类由继承A类那么A类就是C类的超类
二、作用
使用继承时让代码维护更加简单解决多继承带来的重复调用菱形继承、查找顺序MRO问题
三、语法 super(type[, object-or-type])其中 type – 类。 object-or-type – 类一般是 self 注Python 3 和 Python 2 的另一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
四、使用示例
1.通过super() 来调用父类的__init__ 构造方法
class Person():def __init__(self):print(我是Peson的__init__构造方法)class Student(Person):def __init__self:super().__init__()print我是Student的__init__构造方法)stu Student()
运行结果
2.通过supper() 来调用与子类同名的父类方法
2.1 单继承
在单继承中 super 就像大家所想的那样主要是用来调用父类的方法的。
class A:def __init__(self):self.n 2def add(self, m):print(self is {0} A.add.format(self))self.n mclass B(A):def __init__(self):self.n 3def add(self, m):print(self is {0} B.add.format(self))super().add(m)self.n 3
b B()
b.add(2)
print(b.n)
输出结果
1、super().add(m) 确实调用了父类 A 的 add 方法。 2、super().add(m) 调用父类方法 def add(self, m) 时, 此时父类中 self 并不是父类的实例而是子类的实例, 所以 b.add(2) 之后的结果是 5 而不是 4
2.2 多继承
在多继承中会涉及到一个MRO(继承父类方法时的顺序表) 的调用排序问题。即严格按照MRO 顺序执行super方法
class A:def __init__(self):self.n 2def add(self, m):print(self is {0} A.add.format(self))self.n mclass B(A):def __init__(self):self.n 3def add(self, m):print(self is {0} B.add.format(self))super().add(m)self.n 3class C(A):def __init__(self):self.n 4def add(self, m):print(self is {0} C.add.format(self))super().add(m)self.n 4class D(B, C):def __init__(self):self.n 5def add(self, m):print(self is {0} D.add.format(self))super().add(m)self.n 5d D()
d.add(2)
print(d.n)
out:
self is __main__.D object at 0x10ce10e48 D.add
self is __main__.D object at 0x10ce10e48 B.add
self is __main__.D object at 0x10ce10e48 C.add
self is __main__.D object at 0x10ce10e48 A.add
19
同样不管往上调用几次调用父类方法中 self 并不是父类的实例而是子类的实例在上例中都是D的实例化对象 D.mro() [D,B, C, A, object] 多继承的执行顺序会严格按照mro的顺序执行。 整体的调用流程图如下 1.super().__init__相对于类名.init在单继承上用法基本无差别 2.但在多继承上有区别super方法能保证每个父类的方法只会执行一次而使用类名的方法会导致方法被执行多次。 3.多继承时使用super方法对父类的传参数应该是由于python中super的算法导致的原因必须把参数全部传递否则会报错 4.单继承时使用super方法则不能全部传递只能传父类方法所需的参数否则会报错