多态

亡梦爱人 提交于 2020-03-14 15:23:07

在说多态之前,先看下以下代码:

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!