super的查找顺序严格按照mro列表找
调用父类方法的第一种方式:指名道姓的方式,跟继承关无关
# 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()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY