带有__iter __()的自定义对象不返回__tuple __()中定义的内容?

问题描述:

在定义了__iter__()的自定义对象中,当调用tuple(obj)时,它以元组形式返回__iter__()的数据,但我希望它从__tuple__()返回。带有__iter __()的自定义对象不返回__tuple __()中定义的内容?

这是一个非常大的班级,我不想在这里粘贴它。我反而写了一个我的问题的小例子。

class Example: 
    def __init__(self, a, b): 
     self.data = [a, b] 

    def __iter__(self): 
     return iter(reversed(self.data)) 

    def __tuple__(self): 
     return map(str, self.data) 


ex = Example(2, 3) 

print([x for x in ex]) # Should return the data from __iter__(). 
>>> [3, 2] # Reversed, good... 

print(tuple(ex)) # Now calling: __tuple__(). 
>>> (3, 2) # Should have returned ["2", "3"]. 

如果您需要查看我的所有代码,请询问我将它放入Pastebin中。我只是想为您节省通过所有这些额外方法进行排序的努力。

是否__iter__()覆盖__tuple__()类型?出于某种原因,我无法改变它从__tuple__()返回应该返回的内容。

在此先感谢。

+1

您究竟在哪里实现了'__tuple__'方法?它不在[数据模型](https://docs.python.org/3/reference/datamodel.html)中。这是你应该预期的行为。 – jonrsharpe

+3

没有办法'打印(元组(ex))''打印'[3,2]''。这不是一个元组。 – user2357112

+0

请投票结束此事,因为如果它留下,它会毁掉我的代表。我以为'__tuple __()'存在,说实话从来没有想过它不会。毕竟,存在'__str __()'。 – spikespaz

__tuple__是不是一回事。 tuple不寻找__tuple__方法来执行转换为元组。我不知道你有什么想法。

+0

因为存在__str __()。 – spikespaz

+2

@spikespaz,一个可理解的推理链。 “'__str__'和'__int__'存在,所以可能有每种内置类型的dunder方法。”有人可能会这么想。但事实并非如此。 – Kevin

+0

@凯文新术语:dunder方法。从未知道。朋友一直将它们称为“魔术”声明。 – spikespaz