2014-03-31 89 views
3

让A类的对象a具有属性“.my_tuple”。 我希望能够获得此属性调用。这是一种干净的方式来实现一种“__tuple__”方法?

tuple(a) 

的simplier办法,我发现是定义,如:

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

但似乎有点脏:我的理解是,“元组(一)”将遍历self.my_tuple为了构建它的副本,而我只需要一个指针...是内置的“元组”优化来处理这些情况?如果不是,这是否是一个最好的方式来做到这一点(保持“pythonic”:在我的情况下,将A型转换为元组是有意义的)。

+2

如果你真的想要一个指针或Pythonic舌头中的引用,为什么不直接调用'a.my_tuple'。元组本身是不可变的,我认为 –

+0

这种情况并不完全是我所描述的:我有几个属性,例如a.b,a.c,a。d和我想能够做元组(a)来获得(b,c,d)。我可以添加一个名为a.tuple()的工作人员,但它对我来说看起来并不pythonic。 – Sebastien

+0

不清楚你在问什么。你的问题听起来像你有一个属性已经是一个元组,你确实想创建一个不必要的元组副本。现在你说你想让元组保存几个(全部?)该类的属性的内容。请澄清。 –

回答

3

内置的tuple()不是作为您的类的定制点而设计的。据我所知,没有用于转换为元组的定制点。

因此,您已经使用了一个设计的定制点,iter()内置和相应的__iter__方法。这很好,只要它去,但它确实均不超过您想要的:

  • 更多,因为它允许任何人遍历你的对象,而不仅仅是tuple()
  • 减少因为尽管tuple检测到它的参数是一个元组的情况下,它不检测它从__iter__返回元组迭代器的情况。正如你所看到的,它复制了元组。

因为没有办法直接通过自定义你的对象tuple()(不像iter()len()或其他许多人)的效果,你基本上不能使用tuple()功能访问self.my_tuple的方式。你所能做的就是让它返回一份副本。

基于您的评论:

我有例如AB,AC,AD几个属性,我想 能够做到元组(一)获得(B,C,d)

也许你可以利用collections.namedtuple

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

当然,这意味着A这些属性是不可改变的,所以我如果这不是你想要的,那么这没有帮助。

1

从你的问题提出的各种意见,我建议允许获得从一个对象的属性的元组:

>>> 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') 

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

相关问题