super的查找顺序严格按照mro列表找

发布时间 2023-10-30 11:38:19作者: hanyingshuo

调用父类方法的第一种方式:指名道姓的方式,跟继承关无关

# object写与不写,在py3中没有区别.
# 有的人在py3中这么写,是为了向下兼容,使复制到py2中也能使用
class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
        
def init_1(self,name,age):
    self.name=name
    self.age=age

class Student:
    school = 'yyyy'
    def __init__(self,name,age,course):
        # 指名道姓的使用Person的__init__方法
        # Person.__init__(self,name,age)
        init_1(self,name,age)
        self.course=course
    
stu = Student('mayue',17,'python')
print(stu.name)

调用父类方法的第二种方式:用super关键字,跟继承关系有关

class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
        
class Student(Person):
    school = 'yyyy'
    def __init__(self,name,age,course):
        # super()相当于得到了一个特殊对象,第一个参数不需要传,调用绑定方法会把自己传过去
        #__________self不需要传
        super().__init__(name,age)	# 继承和super关键字结合就可以实现继承和重用父类的属性和方法,减少代码的冗余
        
        # 看到有人这么写:super(类名,对象)	# 在py3中为了兼容py2
        # 在py3中这么写和省略写法完全一样
        # 在py2中必须super(Student,self)这么写
        # super(Student,self).__init__(name,age)
        
        self.course=course
    
stu = Student('mayue',17,'python')
print(stu.name)
print(stu.age)
print(stU.course)

总结,有继承关系的时候,通常用super

指名道的方式在什么情况下用?

第一种:没有继承关系

第二种:如果继承了多个父类,super是按照mro列表找,现在想指名道姓的用其中一个父类其中的方法,就需要指名道姓的使用

super练习: super是按照mro列表来找

class A:
    def f1(self):
        print('A.f1')

class B:
    def f1(self):
        print('B.f1')
    def f2(self):
        print('B.f2')
        super().f1()		# super 按照mro列表本身所在位置的下一层调用

class C(B,A):
# 注意这个顺序,这个是报错的
# class C(A,B):
    def f1(self):
        print('C.f1')

# C 实例化产生一个对象
c = C()
print(C.mro())
c.f2()