假设我有不同的类型,如:
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正确的?
答案 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)