让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转换为元组是有意义的。)
答案 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')
显示所有属性,因此如果您想要排除某些属性,这不是好方向,但这可能符合您的需求。