假设我有两种类型的轴对齐矩形:
a)由左上角和右下角定义:(x1,y1),(x2,y2)
b)由(x1,y1)和(宽度,高度)
目的是创建pythonic-way代码,允许在这些类型之间进行转换。例如。如果有一个只在其中一个表示中执行计算的函数,它首先在给定的矩形对象上调用必要的转换。
我可以想到三种实现方法:
您认为哪一种方法最好,或者可能有更好的方法?
答案 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)