6.3多态性多态性是指同一个对象在不同的??情况下有不同的状态。多态不是一种语法,而是一种设计思想。多态:一种调用方式,不同的执行效果多态:同一事物的多种形式,动物分为人、猪、狗多态和多态Mixin设计模式主要是利用多重继承来扩展类的功能Mixin概念MRO和MixinMixin模式MixinMROMRO我们使用多重继承语法来实现MixinusingMixinimplementation在进行多重继承时要非常小心。首先,它必须表达一个单一的功能,而不是一个项目。职责必须是单一的。如果有多个函数,就写多个Mixins。Mixin不能依赖于子类的实现。子类不继承这个Mixin类,它仍然可以工作,但它缺乏一定的功能优势。使用Mixin可以在不对类做任何修改的情况下扩展功能。不同功能部件的划分可根据需要任意调整。可以避免功能类的组合。创建了很多新类,导致类继承混乱。7、类相关函数issubclass:检查一个类是否是另一个类的子类isinstance:检查一个对象是否是一个类的实例hasattr:检查一个对象是否有成员xxxgetattr:getattributessetattr:setattributedelattr:deleteattributedir:get对象类A()的成员列表:passclassB(A):passclassC(B,A):passprint(A.__mro__)print(B.__mro__)(,)(,,)#多重继承的例子#子类可以直接拥有父类的属性和方法,私有属性和方法除外方法classFish():def__init__(self,name):self.name=namedefswim(self):print("Iamswimming...")classBird():def__init__(self,name):self.name=namedeffly(self):print("Iamflying....")classPerson():def__init__(self,name):self.name=namedefworked(自我):print("Working...")类SuperMan(Person,Bird,Fish):def__init__(self,name):self.name=names=SuperMan("a")s.fly()s.swim()s.worked()#单继承类实例Student(Person):def__init__(self,name):self.name=namestu=Student("a")stu.worked()我飞了.....我在游泳...工作...工作...#钻石继承问题classA():passclassB(A):passclassC(A):passclassD(B,C):pass#ConstructorexampleclassPerson():#实例化Person类时#姓名必须确定#年龄必须确定#地址必须有def__init__(self):self.name="NoName"self.age=18self.address="Studentwhonheim"print("Ininitfunc")#实例化一个人p=Person()ininitfunc#构造函数调用顺序-1#如果子类没有写构造函数,会自动向上查找,直到找到找到类A():def__init__(self):print("A")classB(A):def__init__(self):print("B")classC(B):pass#此时,C#的第一个构造函数如果没有,则按照MRO的顺序查找父类的构造函数,直到找到c=C()A#构造函数调用顺序-2classA():def__init__(self):print("A")classB(A):def__init__(self,name):print("B")print(name)classC(B):pass#此时,首先C#的构造函数,如果没有,按MRO顺序向上查找父类的构造函数untilUntilitisfound#此时会出现参数结构不对应c=C()的错误----------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)in14#如果没有,按MRO顺序向上查找父类的构造函数,直到找到15#这时候会有参数结构不对应的错误--->16c=C()TypeError:__init__()missing1re所需位置参数:'name'#构造函数调用顺序-3classA():def__init__(self):print("A")classB(A):def__init__(self,name):print("B")print(name)classC(B):#我想在C#中扩展B的构造函数也就是在调用B#的构造函数后添加一些函数有两种方法完成'''#首先是通过父类名调用def__init__(self,name):#首先调用父类构造函数B.__init__(self,name)#其次是添加自己的函数print("ThisisCAdditionalfunctionsin")'''#二、使用super调用def__init__(self,name):#先调用父类构造函数super(C,self).__init__(name)#二、添加自己的函数print("ThisisanadditionalfunctioninC")#此时先C#的构造函数,如果没有,则按照MRO顺序向上查找父类的构造函数,直到找到#此时的参数结构体会出现相应的错误c=C("IamC")BIamC这是C#中的一个附加函数mixincaseclassPerson():name="ruochen"age=18defeat(self):print("EAT.....")defdrink(self):print("DRINK......")defsleep():print("SLEEP......")classTeacher(Person):defwork(self):print("Work")classStudent(Person):defstudy(self):print("Study")classTutor(Teacher,学生):pass=Tutor()print(Tutor.__mro__)print(t.__dict__)print(Tutor.__dict__)print("*"*20)classTeacherMixin():defwork(self):print("Work")类StudentMixin():defstudy(self):print("Study")类TutorM(Person,TeacherMixin,StudentMixin):passtt=TutorM()print(TutorM.__mro__)print(tt.__dict__)print(TutorM.__dict__)(,,,,){}{'__module__':'__main__','__doc__':无}********************(<类'__main__.TutorM'>,<类'__main__.Person'>,<类'__main__。TeacherMixin'>,,){}{'__module__':'__main__','__doc__':无}#issubclassclassA():passclassB(A):passclassC():passprint(issubclass(B,A))print(issubclass(C,A))print(issubclass(C,object))TrueFalseTrue#isinstanceclassA():passa=A()print(isinstance(a,A))print(isinstance(A,A))TrueFalse#hasattrclassA():name="NoName"a=A()print(hasattr(a,"name"))print(hasattr(a,"age"))真False#help案例#我想知道setattr的具体用法help(setattr)Helponbuilt-infunctionsetattrinmodulebuiltins:setattr(obj,name,value,/)将给定对象上的命名属性设置为指定值。setattr(x,'y',v)等价于``x.y=v''#dir案例classA():pass#dir(A)a=Adir(a)['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__']