1,什么是继承
继承是一种新建类的方式,在python中支持多继承
新建的类称为子类或者派生类,被继承的父类也可以称为基类或超类,子类会继承父类的属性
2,为什么要用继承
减少代码冗余
3,怎么用继承
在定义类的时候,在括号内加上类名,括号内的类就是父类,定义的类就是子类
class ParentClass1: pass class ParentClass2: pass class Subclass1(ParentClass1): pass class Subclass2(ParentClass1,ParentClass2,): pass #使用__bases__来查看子类继承的父类 print(Subclass2.__bases__)
4,继承关系
继承是类和类之间的关系,寻找这种关系需要先抽象在继承
继承:是基于抽象的结果。通过编程语言去实现继承,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构
5基于单继承的属性查找
当子类只继承一个父类的属性时,
属性的查找顺序为:::对象自己的名称空间-----子类的名称空间----父类的名称空间
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()
6,派生:子类定义自己的新的属性,如果属性名与父类同名,就以子类自己的为准
定义这个新属性的过程就是派生
class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.age = age self.name = name 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()
7,在子类派生出的新属性中重用父类的功能
1,指名道姓的调用(与继承没有关系)
方法:在派生的定义过程中,直接使用父类名 . 属性名去调用父类的功能
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()
2,super() 调用(严格依赖继承)
#super()的返回值是一个特殊的对象。这个对象专门用来调用父类的属性
注意:python2中, 调用格式:super(自己的类名,self)
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, level, salary): super().__init__(name,age,sex) self.level = level self.salary = salary def tell_info(self): super().tell_info() print(""" 等级:%s 薪资:%s """ %(self.level,self.salary)) tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1) tea1.tell_info()
8,新式类和经典类
新式类:继承object的类,以及该类的子类,都是新式类
在python3中,如果一个类没有指定继承的父类,默认就继承object,
所以python3中所有的类都是新式类
经典类:(只有在python2才区分经典类和新式类)
没有继承object的类,以及该类的子类,都是经典类
9,多继承背景下的属性查找
1,在非菱形结构的情况下,按照继承的先后顺序,一个分支一个分支的查处,查找完一个分支再找下一个分支,直到结束
2,菱形结构结构时,分一下两个情况
经典类:深度优先
新式类:广度优先
10,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()
11.关于__init__方法
强调:方法内可以任意的python代码
一定不能有返回值