我建议你考虑使用
collections.namedtuple工厂函数制作你的Point类,这将使它成为内置元组类的子类.这将为您节省一些锅炉板工作. namedtuple类具有可以通过名称访问的属性,例如p.x和索引,如p [0].
它们也像元组一样非常有效,如果你有很多类实例,这可能很重要.
您可以进一步专门化通过子类化返回的内容,或使用verbose选项捕获源代码并根据需要进行修改.
在上面链接的文档中有一个示例,显示它用于创建2D Point类,这似乎在您的特定用例中非常有用.
这是一个示例,展示了如何通过子类化定义自定义3D Point类:
from collections import namedtuple
class Point(namedtuple('Point', 'x y z')):
__slots__ = () # prevent creation of instance dictionaries to save memory
point_count = 0 # instance counter
def __init__(self, *args):
super(Point, self).__init__(*args)
Point.point_count += 1
def distance(self, other):
return sum((self[i]-other[i])**2 for i in xrange(len(self))) ** 0.5
def copy_point(self, distance):
'create another Point at distance from the self Point'
return Point(*[dimension+distance for dimension in self])
p1 = Point(0, 0, 0)
print 'p1:', p1
p2 = p1.copy_point(20)
print 'p2: Point(%s)' % ', '.join(str(p2[i]) for i in xrange(len(p2)))
print 'distance p1 p2: %.3f' % p1.distance(p2)
输出:
p1: Point(x=1, y=2, z=3)
p2: Point(21, 22, 23)
distance p1 p2: 34.641
请注意,通过使用namedtuple,您不必自己实现__getitem __(),也不必编写__str __()方法.需要__init __()的唯一原因是因为需要增加已添加的类实例计数器 – 这是nameupups默认情况下没有或没有的.