一、继承
1.什么是继承?
继承是一种新建类的方式,在python中支持一个儿子继承多个爹
新建的类称为子类或派生类
父类又可称为基类或者超类
子类会"遗产"父类的属性
2.为什么要使用继承
减少代码冗余
3怎么用继承

class ParentClass1: #父类 pass class ParentClass2: #父类 pass class Subclass1(ParentClass1): #子类 pass class Subclass2(ParentClass1,ParentClass2): pass print(Subclass1.__bases__) #.__bases__# 类所有父类构成的元组(在讲继承时会讲) print(Subclass2.__bases__)
二、寻找继承关系
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)
三、基于继承再看属性查找
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__) #打印对象的特征字典=》{'name': 'egon', 'age': 18, 'sex': 'male'},对象/类名.__dict__# 类/对象的字典属性 # print(tea1.name) #打印对象的名字属性=》egon # print(tea1.school) #=》oldboy # print(tea1.change_score) #累的一种绑定方法 =》<bound method OldboyTeacher.change_score of <__main__.OldboyTeacher object at 0x0000000001E7EF98>> print(tea1.f1) #先从自己查找 ,自己没有到自己的类中进行查找,没有到父类中查找 # <bound method OldboyPeople.f1 of <__main__.OldboyTeacher object at 0x00000000021CEF98>>
继承的属性查找
class Foo: def f1(self): print('Foo.f1') def f2(self): #self=obj print('Foo.f2') self.f1() #obj.f1(),不会就近调用父类中的f1,而是调用子类中的f1 class Bar(Foo): def f1(self): print('Bar.f1') obj=Bar() #调用的类没有传参 print(obj.__dict__) #打印的是一个空字典 obj.f2() #继承的属性查找=》Foo.f2》》Foo.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.change_score() #通过对象的名称空间中的名字name,指向类中的名称空间的名字change_score ,=>>teacher egon is changing score tea1.f1()
五、经典类与新式类
'''
1、新式类:
继承object的类,以及该类的子类,都是新式类
在python3中,如果一个类没有指定继承的父类,默认就继承object
所以说python3中所有的类都是新式类
2、经典类(只有在python2才区分经典类与新式类):
没有继承object的类,以及该类的子类,都是经典类
'''
# print(object) class Foo(object): pass class Bar(Foo): pass # print(Foo.__bases__) print(Bar.__bases__)