我有一个名为Point
的Python类,它基本上是x
和y
值的持有者,具有用于查找距离,角度等的附加功能{{1 }}
为了将一个点传递给可能需要Point
和x
分开的其他函数,我希望能够使用y
运算符来解包我的{{ 1}}只是单独的*
,Point
值。
我发现,如果我覆盖x
并为任何超过1的索引提出y
,并且__getitem__
对应0且StopIterationException
为1,则可以执行此操作。
然而,当x
/ y
更适合超过1的值时,提出StopIteration
似乎不合适。
有没有人知道为自定义类实现ValueError
运算符的正确方法?优选地,这种方式不会引发KeyError
到*
?
答案 0 :(得分:4)
您可以通过覆盖__iter__
魔术方法来实现相同的功能,例如
class Point(object):
def __init__(self, x, y):
self.x, self.y = x, y
def __iter__(self):
return (self.__dict__[item] for item in sorted(self.__dict__))
def printer(x, y):
print x, y
printer(*Point(2, 3))
<强>输出强>
2 3
答案 1 :(得分:1)
以下是另一种使用__dict__
的方法,但您可以精确控制订单,而无需对每次访问的键执行排序:
def __iter__(self): return (self.__dict__[item] for item in 'xy')
当然,您可以在某处隐藏已排序的元组,列表或字符串,但我认为在这里使用文字是有道理的。
虽然我在这里,但是这是设置器和放置器的唯一方法。 getter方法。
def __getitem__(self, key): return (self.x, self.y)[key]
def __setitem__(self, key, val): setattr(self, 'xy'[key], val)