它是一种实现一种“__tuple__”方法的干净方法吗?

时间:2014-03-31 09:48:26

标签: python python-3.x

让A类的对象a具有属性" .my_tuple"。 我希望能够调用此属性。

tuple(a)

我找到的简单方法是定义A,例如:

class A():
    # other things
    def __iter__(self):
        return self.my_tuple.__iter__()

但它似乎有点脏:我所理解的是"元组(a)"将迭代self.my_tuple以构建它的副本,而我只需要一个指针...它是内置的"元组"优化处理这些案件?如果没有,这是一个最好的方法吗(保持它" pythonic":在我的情况下,将A-type转换为元组是有意义的。)

2 个答案:

答案 0 :(得分:4)

内置tuple()并非设计为您的类的自定义点。据我所知,转换为元组没有自定义点。

因此,您使用了设计的自定义点,iter()内置和相应的__iter__方法。尽管它很好,但它的确比你想要的更少,更多:

  • 更多,因为它允许任何人迭代您的对象,而不只是tuple()
  • 较少,因为尽管tuple检测到它的参数是一个元组,但它没有检测到它从__iter__返回一个元组迭代器的情况。所以你已经看到它复制了元组。

由于无法直接自定义将对象传递给tuple()的效果(与iter()len()或许多其他人不同),您基本上无法使用tuple()用作访问self.my_tuple的方式。你所能做的就是让它返回一份副本。

根据您的评论:

  

我有几个属性,例如a.b,a.c,a.d,我想   能够做元组(a)得到(b,c,d)

您也许可以使用collections.namedtuple

class A(collections.namedtuple('A', 'b c d')):
    # whatever methods you need

当然这意味着A的这些属性是不可变的,所以如果那不是你想要的,那么它就无济于事。

答案 1 :(得分:2)

根据您提出的各种评论,我的建议允许从对象的属性中获取元组:

>>> class Tupleable(object):
    def __iter__(self):
        return (v for v in self.__dict__.itervalues())

>>> class A(Tupleable):
    def __init__(self, a, b):
        self.a = a
        self.b = b

>>> a = A(2, 'e')
>>> tuple(a)
(2, 'e')

显示所有属性,因此如果您想要排除某些属性,这不是好方向,但这可能符合您的需求。