调用父类方法的第一种方式:指名道姓的方式,跟继承关无关
# 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()
标签:__,name,age,init,查找,super,self,mro
From: https://www.cnblogs.com/hanyingshuo/p/17797410.html