继承与派生
第1章 继承与派生
1.1 什么是继承
继承一种新建类的的方式,在python中支持一个儿子继承多个爹
新建的类称为子类或者派生类,
父类又可以称为基类或者超类
子类会”遗传“父类的属性
1.2 为什么要用继承
减少代码冗余
1.3 怎么用继承
示例:
class ParentClass1: pass class ParentClass2: pass class Subclass1(ParentClass1): pass class Subclass2(ParentClass1,ParentClass2): pass # print(Subclass1.__bases__) print(Subclass2.__bases__)
了解:
# 在python2中有经典类与新式类之分
# 在python3中全都为新式类
1.4 寻找继承的关系
'''
1 继承是类与类之间的关系,寻找这种关系需要先抽象再继承
'''
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('teacher %s is changing score' %self.name)
class Oldboystudent(OldboyPeople):
def choose(self):
print('student %s choose course' %self.name)
tea1 = OldboyTeacher('egon', 18, 'male') #OldboyTeacher.__init__(...)
stu1=Oldboystudent('alex',73,'female')
print(tea1.name,tea1.age,tea1.sex)
# print(stu1.name)
1.5 基于继承在看属性查找
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) tea1 = OldboyTeacher('egon', 18, 'male') # print(tea1.__dict__) # print(tea1.name) # print(tea1.school) # print(tea1.change_score) # print(tea1.f1)
1.6 派生
1.6.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() 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 __init__(self,name,age,sex,level,salary): self.name=name self.age=age self.sex=sex self.level=level self.salary=salary def change_score(self): print('teacher %s is changing score' %self.name) def f1(self): print('儿子的f1') tea1 = OldboyTeacher('egon', 18, 'male',9,3.1) print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)
1.7 在子类派生出的新方法中重用父类的功能
1.7.1 方式一:指名道姓的使用
OldboyPeople.__init__(self,name, age, sex) 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): # tea1,'egon', 18, 'male', 9, 3.1 def __init__(self, name, age, sex, level, salary): # self.name = name # self.age = age # self.sex = sex OldboyPeople.__init__(self,name, age, sex) self.level = level self.salary = salary def tell_info(self): OldboyPeople.tell_info(self) print(""" 等级:%s 薪资:%s """ %(self.level,self.salary)) tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1) # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) tea1.tell_info()
1.7.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): # tea1,'egon', 18, 'male', 9, 3.1 def __init__(self, name, age, sex, level, salary): # OldboyPeople.__init__(self,name, age, sex) super(OldboyTeacher,self).__init__(name,age,sex) self.level = level self.salary = salary def tell_info(self): # OldboyPeople.tell_info(self) super().tell_info() print(""" 等级:%s 薪资:%s """ %(self.level,self.salary)) tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1) # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) tea1.tell_info()
1.8 经典类与新式类
'''
1、新式类:
继承object的类,以及该类的子类,都是新式类
在python3中,如果一个类没有指定继承的父类,默认就继承object
所以说python3中所有的类都是新式类
2、经典类(只有在python2才区分经典类与新式类):
没有继承object的类,以及该类的子类,都是经典类
''' # print(object) class Foo(object): pass class Bar(Foo): pass # print(Foo.__bases__) print(Bar.__bases__)
1.9 在多继承背景下的属性查找
#coding:utf-8
#在菱形继承的背景下,查找属性
#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())
1.10 super()依赖继承
#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()