相关疑难解决方法(0)

Python动态继承:如何在实例创建时选择基类?

介绍

我在编程工作中遇到了一个有趣的案例,要求我在python中实现动态类继承机制.我在使用术语"动态继承"时的意思是一个特别是不从任何基类继承的类,而是选择在实例化时从几个基类之一继承,具体取决于某些参数.

因此,我的问题如下:在我将介绍的情况下,通过动态继承实现所需额外功能的最佳,最标准和"pythonic"方式是什么.

为了以简单的方式总结这个案例,我将举例说明使用两个代表两种不同图像格式的类:'jpg''png'图像.然后我将尝试添加支持第三种格式的功能:'gz'图像.我意识到我的问题并不那么简单,但我希望你已经准备好与我一起承担更多的问题了.

两个图像的例子情况

此脚本包含两个类:ImageJPGImagePNG,都继Image承自基类.要创建图像对象的实例,系统会要求用户image_factory使用文件路径作为唯一参数来调用该函数.

然后,此函数从路径中猜出文件格式(jpgpng),并返回相应类的实例.

两个具体的图像类(ImageJPGImagePNG)都能够通过其data属性解码文件.两者都以不同的方式做到这一点.但是,Image为了执行此操作,都要求基类提供文件对象.

UML图1

import os

#------------------------------------------------------------------------------#
def image_factory(path):
    '''Guesses the file format from the file extension
       and returns a corresponding image instance.'''
    format = os.path.splitext(path)[1][1:]
    if format == 'jpg': return ImageJPG(path)
    if format == 'png': return ImagePNG(path)
    else: raise Exception('The format "' + format + '" is not supported.') …
Run Code Online (Sandbox Code Playgroud)

python oop inheritance design-patterns

37
推荐指数
3
解决办法
2万
查看次数

标签 统计

design-patterns ×1

inheritance ×1

oop ×1

python ×1