day20继承

1、继承

继承是一种那类的方式,在python中支持一个儿子继承多个爹

新建的类称为子类或者派生类,

父类又可以称为基类或者超类

子类会‘遗传‘父类的属性

2、减少代码冗余

继承是类与类之间的关系,寻找这种关系需要先抽象再继承

class OldboyPeople:

  school='oldboy'

  def __init__(self,name,age,sex):

    self.name=name

    self.age=age

    self.sex=sex

class OldboyTeacher(OldboyPeople)

    def change_score(self):

    print('%s老师修改成绩'%self.name)

class Oldboystudent(OldboyPeople):

    def choose(self):

      print('%S学生选课'%self.name)

属性查找

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

def f2(self): #self=obj
print('Foo.f2')
self.f1() #obj.f1()

class Bar(Foo):
def f1(self):
print('Bar.f1')

obj=Bar()
# print(obj.__dict__)
obj.f2()
先找本对象本身,没有去本身的类查找,找不到再去父类查找

派生:子类定义自己新的属性,如果与父类同名,以子类自己为准
class OldboyPeople:
school = 'oldboy'

def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex

def f1(self):
print('爹的f1')
class OldboyTeacher(OldboyPeople):
def change_score(self):
print('teacher %s is changing score' %self.name)

def f1(self):
print('儿子的f1')

tea1 = OldboyTeacher('egon', 18, 'male')
tea1.f1()


在子类派生出的新方法中重用父类的功能
方式一:指名道姓地调用(其实与继承没有什么关系的)
方式二:super()调用(严格依赖于继承)
super()的返回值是一个特殊的对象,该对象专门用来调用父类中的属性
class OldboyPeople:
school='oldboy'
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def tell_info(self):
print("""
===========个人信息==========
姓名:%s
年龄:%s
性别:%s
""" %(self.name,self.age,self.sex))


class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,salary,level):
# OldboyPeople.__init__(self,name,age,sex)
super().__init__(name,age,sex)
self.salary=salary
self.level=level

def change_course(self):
print('%s修改成绩'%self)

def tell_info(self):
# OldboyPeople.tell_info(self)
super().tell_info()
print('''
等级%s
薪资%s
'''%(self.salary,self.level))

test1=OldboyTeacher('egon',18,'mail',3.1,9)
print(test1)
test1.tell_info()

经典类与新式类
1、新式类:
继承object的类,以及该类的子类,都是新式类

在python3中,如果一个类没有指定继承的父类,默认就继承object
所以说python3中所有的类都是新式类

2、经典类(只有在python2才区分经典类与新式类):
没有继承object的类,以及该类的子类,都是经典类
在菱形继承的背景下,查找属性
1、经典类:深度优先
2、新式类:广度优先
class A:
    # def test(self):
    #     print('from A')
    pass

class B(A):
    # def test(self):
    #     print('from B')
    pass

class C(A):
    # def test(self):
    #     print('from C')
    pass
class D(B):
    # def test(self):
    #     print('from D')
    pass

class E(C):
    # def test(self):
    #     print('from E')
    pass

class F(D,E):
    # def test(self):
    #     print('from F')
    pass
# f1=F()
# f1.test()

# F->D->B->E->C-A->object

print(F.mro())

 




super()会严格按照mro列表从当前查找到的位置继续往后查找
class A:
def test(self):
print('A.test')
super().f1()
class B:
def f1(self):
print('from B')
class C(A,B):
pass

c=C()
print(C.mro()) #C->A->B->object


c.test()


原文地址:https://www.cnblogs.com/lg04551/p/8807917.html