1.什么是继承
继承是一种新建类的方式,新建的类称之为子类,被继承的类称之为基类,父类,超类
继承描述的是一种“遗传”的关系:子类可以重用父类的属性
在python中的继承注意两点:
1.在python中支持一个子类同时继承多个父类
2.python中类分为两种:
新式类:但凡继承object的类,以及该类的子类。。。都是新式类
在python3中一个类如果没有继承类,默认继承object类,即python3中所有的类都是新式类
经典类:没有继承object类,以及该类的子类。。。都是经典类
在python2张总才区分新式类与经典类
2.为什么要使用继承
减少代码冗余
3.如何使用继承
class Parent1(object): pass # print(Parent1.__bases__) class Parent2: pass class Subclass1(Parent1,Parent2): pass print(Subclass1.__bases__)
3.1如何在子类派生出的新方法中重用父类
class OldboyPeople: school='Oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class OldboyStudent(OldboyPeople): def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex self.score=0 def choose_course(self): print('%s is choosing course' %self.name) class OldboyTeacher(OldboyPeople): # def __init__(self,name,age,sex,level): # self.name=name # self.age=age # self.sex=sex # self.level=level def score(self,stu,num): stu.score=num stu1=OldboyStudent('李特丹',18,'female') #OldboyPeople.__init__(stu1,'李特丹',18,'female') print(stu1.__dict__) tea1=OldboyTeacher('egon',18,'male') ##OldboyPeople.__init__(tea1,'egon',18,'male',10) print(tea1.__dict__)
单继承背景下属性查找的顺序:对象-》对象的类-》父类-》
class Foo: # x=333 pass class Bar(Foo): # x=222 pass obj=Bar() # obj.x=111 print(obj.x) class Foo: def f1(self): print('Foo.f1') def f2(self): print('Foo.f2') self.f1() #obj.f1() class Bar(Foo): def f1(self): print('Bar.f1') obj=Bar() obj.f2() ''' Foo.f2 Bar.f1 '''
多继承背景下属性查找的顺序:对象-》对象的类-》按照从左往右的顺序一个一个的分支找下去
#第四层 class I: # x='I' pass #第三层 class E: # x='E' pass class F(I): # x='F' pass class H: x='H' # 第二层 class B(E): # x='B' pass class C(F): # x='C' pass class D(H): # x='D' pass #第一层 class A(B,C,D): # x='A' pass obj=A() # obj.x=111 print(obj.x)
一旦出现菱形继承问题,在新式类与经典类在属性查找上的区别是
新式类:广度优先查找,在最后一个分支查找顶级类
经典类:深度优先查找,在第一个分支就查找顶级类
class G(object): # def test(self): # print('from G') pass # 第三层 class E(G): # def test(self): # print('from E') pass class F(G): def test(self): print('from F') pass # 第二层 class B(E): # def test(self): # print('from B') pass class C(F): def test(self): print('from C') pass class D(G): def test(self): print('from D') pass # 第一层 class A(B,C,D): # def test(self): # print('from A') pass obj=A() # obj.test() # 新式类:对象-》A-》B-》E-》C-》F-》D-G # 经典类:对象-》A-》B-》E-》G-》C-》F-》D
在子类派生出的新方法中重用父类功能的方式一:
指名道姓地访问某一个类的函数
注意:
1.该方法与继承是没有关系的
2.访问时某一个类的函数,没有自动传值的效果
class OldboyPeople: school='Oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class OldboyStudent(OldboyPeople): # stu1,'李特丹',18,'female' def __init__(self,name,age,sex,num=0): OldboyPeople.__init__(self,name,age,sex) #OldboyPeople.__init__(stu1,李特丹',18,'female') self.score=num def choose_course(self): print('%s is choosing course' %self.name) class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,level): OldboyPeople.__init__(self,name,age,sex) self.level=level def score(self,stu,num): stu.score=num stu1=OldboyStudent('李特丹',18,'female') #OldboyStudent.__init__(stu1,'李特丹',18,'female') print(stu1.__dict__) tea1=OldboyTeacher('egon',18,'male',10) ##OldboyTeacher.__init__(tea1,'egon',18,'male',10) print(tea1.__dict__)
在子类派生出的新方法中重用父类功能的方式二:只能在子类中用
在python2:super(自己的类名,对象自己)
在python3:super()
调用super()会得到一个特殊的对象,该特殊的对象是专门用来引用父类中的属性的,!!!完全参照mro列表
注意:
该方式与继承严格依赖于继承的mro列表
访问是绑定方法,有在自动传值的效果
class OldboyPeople: school='Oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class OldboyStudent(OldboyPeople): # stu1,'李特丹',18,'female' def __init__(self,name,age,sex,num=0): # OldboyPeople.__init__(self,name,age,sex) #OldboyPeople.__init__(stu1,李特丹',18,'female') super(OldboyStudent,self).__init__(name,age,sex) self.score=num def choose_course(self): print('%s is choosing course' %self.name) class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,level): super().__init__(name,age,sex) self.level=level def score(self,stu,num): stu.score=num # stu1=OldboyStudent('李特丹',18,'female') #OldboyStudent.__init__(stu1,'李特丹',18,'female') # print(stu1.__dict__) # # tea1=OldboyTeacher('egon',18,'male',10) ##OldboyTeacher.__init__(tea1,'egon',18,'male',10) # print(tea1.__dict__)
class A: def test(self): print('A.test()') super().test() class B: def test(self): print('from B') class C(B,A): pass obj=C() # print(C.mro()) #[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>] obj.test() ''' A.test() from B '''