正确实现自定义类的Python Star运算符

时间:2014-10-10 07:07:32

标签: python

我有一个名为Point的Python类,它基本上是xy值的持有者,具有用于查找距离,角度等的附加功能{{1 }}

为了将一个点传递给可能需要Pointx分开的其他函数,我希望能够使用y运算符来解包我的{{ 1}}只是单独的*Point值。

我发现,如果我覆盖x并为任何超过1的索引提出y,并且__getitem__对应0且StopIterationException为1,则可以执行此操作。

然而,当x / y更适合超过1的值时,提出StopIteration似乎不合适。

有没有人知道为自定义类实现ValueError运算符的正确方法?优选地,这种方式不会引发KeyError*

2 个答案:

答案 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)