在说多态之前,先看下以下代码:
class Animal: pass class Dog(Animal): pass class Cat(Animal): pass a = Animal() b = Dog() c = Cat() print(isinstance(a, Animal)) # True print(isinstance(b, Dog)) # True print(isinstance(c, Cat)) # True print(isinstance(b, Animal)) # True print(isinstance(c, Animal)) # True print(isinstance(a, Dog)) # False print(isinstance(a, Cat)) # False # 结论:子类的对象可以是父类的类型之一,但父类的对象不能是子类类型
通过上面的例子,可以知道父类可以对应多种类型,这就叫多态
在项目中,我们会经常遇到存储图片的问题,图片的类型很多,如:.jpg .png .pdf等等
我们如何用多态进行管理呢?代码如下
class PictureFile: def __init__(self, filename): if not filename.endswith(self.ext): # 让父类可以访问不同子类的属性,这就是多态,此外每个子类实现的play方法也是多态起的作用,看下面的封装操作 raise Exception("Invalid file format") self.filename = filename class JPGFile(PictureFile): ext = "jpg" def play(self): print("playing {} as jpg".format(self.filename)) class PNGFile(PictureFile): ext = "png" def play(self): print("playing {} as png".format(self.filename)) class PDFFile(PictureFile): ext = "pdf" def play(self): print("playing {} as pdf".format(self.filename)) # 封装 class Finally: def process_picture(self, img): print("处理图片") img.play() # 由不同的类实例化对象来调用同一个方法,执行逻辑不同,这也是多态,不需要关系内部的处理细节 f = PDFFile('myfile.pdf') s = Finally() s.process_picture(f)结果:
处理图片
playing myfile.pdf as pdf
来源:https://www.cnblogs.com/su-sir/p/12491947.html