设计类似类型的对象之间的类型转换

时间:2015-11-12 19:13:17

标签: python oop

假设我有两种类型的轴对齐矩形:

a)由左上角和右下角定义:(x1,y1),(x2,y2)
b)由(x1,y1)和(宽度,高度)

定义

目的是创建pythonic-way代码,允许在这些类型之间进行转换。例如。如果有一个只在其中一个表示中执行计算的函数,它首先在给定的矩形对象上调用必要的转换。

我可以想到三种实现方法:

  1. 创建从基类继承的两个类。在基础中创建两个“抽象”方法,用于在a)和b)之间转换和返回,其中包含一组 isinstance 分支。重载继承类中的方法,使空方法无用T - > T转换。
  2. 使用一个静态方法创建一个类,接受两个与a)无关的参数和b)
  3. 与2.相同,但摆脱了类,只需在全局源文件范围中创建一个函数
  4. 您认为哪一种方法最好,或者可能有更好的方法?

2 个答案:

答案 0 :(得分:1)

创建一个类,并给它两个构造函数。一个是默认的__init__方法,另一个是接受另一个表单来指定矩形的类方法:

class Rectangle(Shape):
    def __init__(self, x1, y1, x2, y2):
        # ....

    @classmethod
    def fromSize(cls, x1, y1, width, height):
        return cls(x1, y1, x1 + width, y1 + height)

Rectangle.fromSize()类方法将参数转换为4坐标形式并返回新实例。您只存储一个表单来指定一个矩形,额外的classmethod基本上只是一个方便的方法。

我选择了4坐标形式作为规范'这里定义,但如果存储宽度和高度对您的模型更有意义,请随意交换默认和classmethod工厂。

答案 1 :(得分:0)

我建议在init期间创建一个类并处理输入,以确定存在/不存在的内容。然后根据计算添加所有缺少的参数。以下是适合您情况的工作示例:

class RectangleClass:
    def __init__(self, x1, y1, x2=None, y2=None, width=None, height=None):
        if not x2 or not y2:
            self.x2, self.y2 = self.calculate_points(x1, y1, width, height)
        if not width or not height:
            self.height, self.width = self.calculate_dimensions(x1, y1, x2, y2)

    def calculate_points(self, x1, y1, width,height):
        x2 = x1 + width
        y2 = y1 + height
        return x2, y2

    def calculate_dimensions(self, x1, y1, x2,y2):
        width = abs(x2 - x1)
        height = abs(y2 - y1)
        return height, width  

rectangle = RectangleClass(0, 0, x2=-1, y2=5)
print "Rectangle 1: height: %s, width: %s" % (rectangle.height, rectangle.width)

rectangle = RectangleClass(1, 3, height=2, width=2)
print "Rectangle 2: x2: %s, y2: %s" % (rectangle.x2, rectangle.y2)