我有一个类代表我用来替换元组的一个点。使用元组我可以调用x, y = point
如何使用类来模拟此功能?我可以__repr__
返回一个元组,但如果我尝试调用print,它会抛出TypeError: __repr__ returned non-string (type tuple)
。如何处理元组的这个功能?
答案 0 :(得分:4)
如果您希望类的实例像x, y = some_object
这样的多重赋值语句右侧的元组一样可用,则需要使您的类可迭代。这种行为与您班级的__repr__
无关。
尝试这样的事情(无论你需要什么其他方法):
class Point(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __iter__(self):
yield self.x
yield self.y
def __repr__(self):
return "{}({}, {})".format(type(self).__name__, self.x, self.y)
此类的实例是可迭代的,这意味着解包将起作用。它们也可以打印,或者使用str
或repr
转换为字符串。
答案 1 :(得分:2)
请勿使用自己的班级,而是使用collections.namedtuple
?
help(collections.namedtuple)
偶数是关于点类型
答案 2 :(得分:1)
解包基本上是迭代的。以下是如何在Point
类中实现此功能的草图:
>>> class Point:
... def __init__(self, x=0, y=0):
... self._values = (x, y)
... def __iter__(self):
... return iter(self._values)
...
>>> p = Point(1,2)
>>> a,b = p
>>> a
1
>>> b
2
>>>
编辑,当然,在这里我只是包装一个元组,但你可以解压缩任何实现iterator protocol的东西。