多继承,组合,接口,抽象类和鸭子型
多继承的优点是可以继承到更多的方法和属性,功能强大,
缺点是在父类中都有相同的方法时候会不知道所要查找的是哪个方法
所以Python中就有一种算法 就是 c3这种算法来查找,它的查找顺序可以通过 mro 列表查看
在以前的Python中分位新式类和古典类
新式类是直接或者间接的继承object类的
古典类是不直接继承或者换间接继承object这个类的类
在Python3中所有的类都是新式类,
古典类在Python2 中有,Python3 中是没有的
所有在查找方式也是不同的有菱型查找,和多层菱型继承查找
古典类的查找方式是一直找,知道找到公共的父类,如果没有,在依次的查找父类
新式类是先依次的查找父类,然后在查找父类上面继承的类
组合
组合就是把一个类的对象作为另一个类的属性,称之为组合
class MyList(list): def __init__(self,types): super().__init__() self.types = types def append(self, obj): if obj.__class__ == self.types: super().append(obj) else: print("只能储存%s类型" % self.types) m = MyList(int) m.append(10) print(m) class PC: def open_app(self,app_name): print("open %s" % app_name) class OldBoyStudent: def __init__(self,PC,notebook): self.PC = PC self.notebook = notebook pass pc = PC() notebook = PC() stu = OldBoyStudent(pc,notebook)
接口是一套协议规范,具体表现:一堆只有方法声明而没有实现体的方法
例如USB 电脑内部具备USB相应的功能 如果要使用的话 就必须给外界提供一个使用方式,该方式就称之为接口 , 在程序中功能通常是用函数来表示, 对于外界而言 无需清楚函数时如何实现的 只要知道函数名即可, 这个函数名称就可以称之为接口 外界调用接口就能完成某个任务 接口其实就是一组功能的定义,但是只清楚函数名称,而没有具体的实现细节 相当于是一套规范, 例如USB 规定了接口的外观,大小,以及每条线路的功能是什么 硬件开发商照着这个USB协议来生产设备,就可以被电脑使用
抽象类和抽象方法
抽象类就是拥有抽象方法是类就是抽象方法,抽象类是必须要有子类覆盖抽象类中的抽象方法,必须要覆盖
抽象方法是没有具体的实现方法体的方法叫做抽象方法,使用@abc.abstractmethod装饰器修饰的方法是抽象方法
#使用组合和抽象类和抽象方法来限制一些类继承父类后,有不实现类中的方法 #所以就是用抽象类来限制继承的类必须实现父类中的方法 #把一个类转换为抽象类 调用 abc 这个包 import abc class USB(metaclass=abc.ABCMeta): @abc.abstractmethod def opened(self): pass @abc.abstractmethod def working(self): pass @abc.abstractmethod def closed(self): pass class Mouse(USB): def opened(self): print("Mouse opened...") def working(self): print("Mouse working...") def closed(self): print("Mouse closed...") class HT: def conntent_device(self,obj): obj.opened() obj.working() obj.closed() m = Mouse() ht = HT() ht.conntent_device(m)
抽象类和接口的去别
不同点:
1,抽象类中有一般的函数和抽象函数,
2,抽象类中的抽象方法必须要覆盖
3,抽象类是不能实例化的
4,接口中没有一般的方法,只有抽象方法
相同点;
1,他们都需要子类继承,并实现类中的抽象方法
鸭子型
对于一个优秀的程序员,即时没有接口和抽象类的限制,也能写出一个具备扩展性的程序 就如何做到:鸭子类型 鸭子类型:这个对象 长的想鸭子 叫声像鸭子 走路像鸭子 那它就是鸭子 就可以把它当成鸭子来使用
总结:可以不用继承抽象类实现抽象方法,自己类中的方法也和另一个类需要的方法一样,那么就可以直接使用这个类
class Mouse: def opened(self): print("Mouse opened...") def working(self): print("Mouse working...") def closed(self): print("Mouse closed...") class HT: def conntent_device(self,obj): obj.opened() obj.working() obj.closed() m = Mouse() ht = HT() ht.conntent_device(m)