Python类,在通过print或format调用时具有与赋值时不同的值

时间:2017-03-10 22:43:05

标签: python python-2.7 tuples

我有一个类代表我用来替换元组的一个点。使用元组我可以调用x, y = point如何使用类来模拟此功能?我可以__repr__返回一个元组,但如果我尝试调用print,它会抛出TypeError: __repr__ returned non-string (type tuple)。如何处理元组的这个功能?

3 个答案:

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

此类的实例是可迭代的,这意味着解包将起作用。它们也可以打印,或者使用strrepr转换为字符串。

答案 1 :(得分:2)

请勿使用自己的班级,而是使用collections.namedtuplehelp(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的东西。