如何以pythonic方式实现不同类型之间的距离

时间:2015-01-23 16:22:42

标签: python polymorphism overloading

假设我有不同的类型,如:

Point 
Circle 
Rectangle
Polyline
Circle_Collection
Rectangle_collection

我希望能够测量上述任何类型组合之间的距离。最简单的方法是在每个类中实现distance方法:

class Point:
   def distance(self, other):
      if other is Point:
         # handle points
      if other is Circle:
         # handle circles

但后来我认为将它作为一个自由函数实现会更好,因为到另一个对象的距离实际上不是关于类的固有信息。

所以,让我说我会以一种我可以称之为

的方式实现距离
p = Point()
c = Cirle()
print distance(p,c)

最好的方法是什么?我听说函数重载并不是一种真正的pythonic方式。什么是pythonically正确的?

1 个答案:

答案 0 :(得分:1)

如果您正在尝试测量每个形状的中点之间的距离,则此问题会变得更加容易。在一些共同的祖先Shape上实施:

@property
def midpoint(self):
    """returns the midpoint of the shape as
    the tuple (x,y)"""
    # however you'll do this based on your structure
    #
    # note that if your shapes are immutable, you should make this
    # a regular attribute, not a property. I'm assuming your shapes
    # can move

@staticmethod
def distance(a, b):
    a_x, a_y = a.midpoint
    b_x, b_y = b.midpoint
    return (abs(a_x - b_x), abs(a_y - b_y))

你是对的,找到两点之间的距离与对象本身有些分离(即一个对象不应该知道如何找到它与另一个对象的距离),但它确实适合作为一个形状的东西知道。

通过调用

运行
foo = Circle()
bar = Rectangle()

dist = Shape.distance(foo, bar)