在说多态之前,先看下以下代码:
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