Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中数据对象间的转换器设计_Python_Design Patterns_Converter - Fatal编程技术网

python中数据对象间的转换器设计

python中数据对象间的转换器设计,python,design-patterns,converter,Python,Design Patterns,Converter,我正在为可以相互转换的类似数据对象实现一个库。为了更加说明问题,我将在下面假设数据对象是不同的图像类型。我有以下几节课 class PixelImage(object): pass class VectorImage(object): pass class FourierImage(object): pass 在这两者之间设置转换器功能的好方法是什么?这种情况下有什么设计模式吗?问题是,转换器需要一定数量的知识,包括源类和目标类,但我希望防止类之间存在强烈的依赖性。

我正在为可以相互转换的类似数据对象实现一个库。为了更加说明问题,我将在下面假设数据对象是不同的图像类型。我有以下几节课

class PixelImage(object):
    pass

class VectorImage(object):
    pass

class FourierImage(object):
    pass
在这两者之间设置转换器功能的好方法是什么?这种情况下有什么设计模式吗?问题是,转换器需要一定数量的知识,包括源类和目标类,但我希望防止类之间存在强烈的依赖性。此外,如果设计开放,以后可以添加派生类(例如,
类压缩像素图像(PixelImage)

下面我将讨论我提出的两个解决方案。我们非常欢迎其他办法和意见。谢谢

解决方案1:使用成员函数
来_TargetFormat()
,例如

pixel_image = PixelImage()
vector_image = pixel_image.to_vector()
pixel_image = PixelImage()
vector_image = VectorImage.from_pixel(pixel_image)
优点:它很短,用户可以直接在API中看到对象的可能转换(例如在交互式ipython shell中)

缺点:我们的耦合很紧。PixelImage必须了解VectorImage类,特别是它的构造函数,因为它必须创建VectorImage对象。如果我有很多类,每个类都要导入其他所有类

解决方案2:使用_SourceFormat()中的类方法
,例如

pixel_image = PixelImage()
vector_image = pixel_image.to_vector()
pixel_image = PixelImage()
vector_image = VectorImage.from_pixel(pixel_image)
优点:无显式耦合。我们可以输入任何像素的类似图像的对象,并从duck类型中获益。
缺点:类方法调用看起来不那么优雅,可能对用户来说不够直观。

为什么不使用工厂?解决方案3:使用第三个包含转换逻辑的通用
图像
对象。这也有效地防止了耦合,因为除了泛型类之外,任何类都不需要关于其他格式的知识?