6.2继承继承是指一个类可以获得另一个类的成员属性和成员方法。作用:减少代码,增加代码重用功能,同时设置类之间的直接关系。继承与继承的概念:被继承的类称为父类,也称为基类,也称为超类。使用和继承的类称为子类,也称为派生类。继承和被继承的特性之间一定存在is-a关系。所有类都继承自对象类。也就是说,所有类都是对象类的子类。子类一旦继承了父类,就可以使用父类中除私有成员之外的所有内容。子类继承父类后,并没有将父类的成员完全赋值给子类。而是通过引用关系访问和调用子类中可以定义的唯一成员属性和方法。如果子类中定义的成员与父类的成员相同,则优先使用子类的成员。如果要扩展父类的方法,可以在Definenewmethodswhileaccessingparentclassmembersforcodereuse中使用[父类名.父类成员]调用父类成员,或者使用格式[super().父类成员]调用继承变量函数的查找顺序是先查找自己的变量。如果这个类中没有定义,就会去寻找父类的构造函数。如果本类没有定义,会自动查找并调用父类的构造函数。如果这个类有定义,就不会继续往上找了。在实例化类之前调用??该函数。如果定义了构造函数,则实例化时会使用构造函数,不会查找父类构造函数。如果没有定义,会自动查找父类的构造函数。如果没有定义子类,则使用父类。如果构造函数有参数,构造对象时的参数应该根据父类的参数来构造。supersuper不是关键字,而是一个类super。本质关系,但是super可以调用父类super使用两种方法,构造函数中常用调用父类构造函数单继承和多继承单继承:每个类只能继承一个类多继承:每个类都允许继承多类的单继承和多继承的优缺点方便缺点:继承关系混乱菱形继承/菱形继承问题多个子类继承自同一个父类,而这些子类又被同一个类继承,所以继承关系图形成一个菱形图。MRO关于多重继承MROMRO是multipleinheritance,一个用来保存继承顺序的列表。Python本身使用C3算法来计算多重继承的菱形继承结果。MRO列表的计算原则:子类永远在父类的前面。如果有多个父类,继承语法中的括号多个类成功时存储内部类的写法顺序继承同一个父类,孙子只会选择语法括号中第一个父类的父类构造函数。当一个对象被实例化时,系统自动调用的一个函数称为构造函数。通常,该函数用于初始化实例化对象,顾名思义,必须有一个构造函数。如果没有,它会自动向上查找,按照MRO的顺序,直到找到#继承语法#在python中,任何类都有一个共同的父类,叫做objectclassPerson():name="NoName"age=18__score=0#考试成绩是保密的,只要你知道就知道了_petname="sec"#小名字受保护,子类可以使用,但不能publicdefsleep(self):print("Sleeping......")#括号里写的是父类classTeacher(Person):teacher_id="9527"defmake_test(self):print("attention")t=Teacher()print(t.name)print(t._petname)#private访问问题#公有访问私有变量,报错#print(t.__score)t.sleep()print(t.teacher_id)t.make_test()NoNamesecSleeping......9527attention#如果子类和父类定义了相同的name变量,那么子类自己classPerson():name="NoName"age=18__score=0#考试成绩保密,只要你知道it_petname="sec"#小名字,它是受保护的,子类可以使用,但不能publicdefsleep(self):print("Sleeping......")#父类写在括号里classTeacher(人):teacher_id="9527"name="DaNa"defmake_test(self):print("attention")t=Teacherprint(t.name)DaNa#子类扩展父类功能#人有工作功能,老师也有工作功能,但是老师的工作需要讲课classPerson():name="NoName"age=18__score=0#考试成绩保密,只要youKnow_petname="sec"#小名字,它是受保护的,子类可以使用它,但不能publicdefsleep(self):print("Sleeping......")defwork(self):print("makesomemoney")#括号里写的是父类classTeacher(Person):teacher_id="9527"name="DaNa"defmake_test(self):print("attention")defwork(self):#扩展parentclass函数只需要调用父类的同一个函数#Person.work(self)#扩展父类的另一种方式#super代表父类super().work()self.make_test()t=Teacher()t.work()makesomemoneyattention#构造函数类Dog()的概念:#__init__是构造函数#每次实例化都会自动调用第一个#因为主要工作是初始化,命名为def__init__(self):print("Iaminitindog")#实例化时,括号中的参数需要匹配构造函数参数kaka=Dog()Iaminitindog#Inheritedconstructor-1classAnimel():passclassPaxingAni(Animel):passclassDog(PaxingAni):#__init__是构造函数#每个实例实例化时自动调用第一个#因为主要工作是初始化,所以命名为def__init__(self):print("Iaminitindog")#实例化时自动调用Dog的构造Functionkaka=Dog()Iaminitindog#继承中的构造函数-2classAnimel():def__init__(self):print("Animel")classPaxingAni(Animel):def__init__(self):print("PaxingDongwu")classDog(PaxingAni):#__init__是构造函数#每次实例化时,自动调用第一个#因为主要工作是初始化,所以取名def__init__(self):print("Iaminitindog")#实例化时,自动调用Dog的构造函数#因为找到构造函数,不再查找父类的构造函数kaka=Dog()#猫没有写构造函数classCat(PaxingAni):pass#这时候应该会自动调用构造函数,因为Cat没有构造函数,所以看for父类构造函数#如果在PaxingAni中找到构造函数,就不再查找c=Cat()我是dogPaxingDongwu中的init#继承中的构造函数-3classAnimel():def__init__(self):print("Animel")classPaxingAni(Animel):def__init__(self,name):print("PaxingDongwu{0}".format(name))classDog(PaxingAni):#__init__是构造函数#每次实例化第一个被自动调用#因为主要工作是初始化,所以取名为def__init__(self):print("Iaminitindog")#实例化Dog时,找到Dog的构造函数,参数匹配,不报错d=Dog()classCat(PaxingAni):pass#此时,因为Cat没有Constructor,查查#因为PaxingAni的构造函数需要两个参数,实例化的时候给了一个,报错c=Cat()我是initindog----------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)
