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)
我会提供一个问题的例子,以防标题不够清楚。
假设我有一个 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)