为自定义类正确实现Python星形运算符

2024-09-30 20:31:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为Point的Python类,它基本上是一个x和{}值的持有者,它增加了用另一个Point查找距离、角度等的功能。在

为了将一个点传递给其他可能需要xy分开的函数,我希望能够使用*运算符将我的Point解包为单独的xy值。在

我发现,如果我重写__getitem__并为超过1的任何索引引发一个StopIterationException,其中{}对应于0,y到1,这是可能的。在

然而,当ValueError/KeyError更适合于大于1的值时,引发StopIteration似乎不合适。在

有人知道为自定义类实现*运算符的正确方法吗?优选地,不通过StopIteration到{}的方式来提高StopIteration?在


Tags: 方法函数功能距离方式运算符point角度
2条回答

您可以通过重写__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))

输出

^{pr2}$

下面是另一种方法,它使用__dict__,但可以精确控制顺序,而不必对每次访问的键执行排序:

def __iter__(self): return (self.__dict__[item] for item in 'xy')

当然,您可以将已排序的元组、列表或键串存储在某个地方,但我认为在这里使用文本是有意义的。在

在这里,有一种方法可以实现setter和getter方法。在

^{pr2}$

相关问题 更多 >