object 覆盖元组扩展的特殊方法?

special method for an object to override tuple expansion?

我会提供一个问题的例子,以防标题不够清楚。

假设我有一个 class Point(object) 表示二维坐标。 是否可以创建一个允许以下操作的 "magic" 方法?

x, y = point

也许有一些迭代器的技巧?

您可以简单地利用对象的迭代器协议并完成此操作

class Point(object):
    def __init__(self, x,y):
        self.x = x
        self.y = y
        self.points = (x,y)
    def __iter__(self):
        return iter(self.points)

p = Point(1,5)
x,y = p
print x,y
# 1,5

查看 http://www.rafekettler.com/magicmethods.html#sequence 以了解有关如何将自定义对象转换为可迭代对象的更多信息;或者更准确地说,人们将如何使用像可迭代对象这样的对象。

只需提供一个__iter__方法即可。

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __iter__(self):
        yield self.x
        yield self.y

p = Point(1, 2)
x, y = p
assert (1, 2) == (x, y)

不过要小心。这意味着您的 class 突然变得可以安全地用于许多其他以前可能抛出类型错误的地方。

例如

def add_1(x):
    return x + 1
l = list(map(add_1, p)) # works, because the point is iterable

因此,您可能想要提供一种不同于 __iter__ 的方法来提供迭代器。

例如

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def coords(self):
        yield self.x
        yield self.y

p = Point(1, 2)
x, y = p.coords()
assert (1, 2) == (x, y)