我可以使用__iter__
来定义自定义对象的外观dict
。有没有办法单独自定义tuple
转换? (是的,我确实意识到这可能令人困惑,并且可能很少几乎从来不是一个好主意。)
默认行为:
>>>o = MyClass()
>>>dict(o)
{'value': 1, 'attr_1': "foo", 'attr_2': "bar"}
>>>tuple(o)
(('value', 1), ('attr_1', "foo"), ('attr_2', "bar"))
期望的行为:
>>>o = MyClass()
>>>dict(o)
{'value': 1, 'attr_1': "foo", 'attr_2': "bar"}
>>>tuple(o)
(1, {'attr_1': "foo", 'attr_2': "bar"})
以下是o
类属于的最小示例:
class MyClass(object):
def __init__(self):
self.value = 1
self.attributes = {'attr_1': "foo", 'attr_2': "bar"}
def __iter__(self):
yield ("value", self.value)
for k, v in self.attributes.items():
yield (k, v)
相关,但没有关于dict和元组的不同结构:special method for an object to override tuple expansion?
答案 0 :(得分:0)
为元组编写自己的构造函数是一个更好的主意:
class MyTuple(tuple):
@classmethod
def from_default_tuple(cls): # your alternative constructor
pass
如果你真的想改变tuple
,这一行没有错:(除了你的IDE会认为你有点疯狂)
tuple = MyTuple.from_default_tuple
但这绝对是一个坏主意。我建议你改用MyTuple.from_default_tuple()
答案 1 :(得分:-1)
您可以自定义元组的特殊方法__str__
或__repr__
。
class my_tuple(tuple):
def __repr__(self):
return "(%r, %r)" % (self[0][1], dict(self[1:]))
test = MyClass()
print my_tuple(test)
UPFATE
您可以重写自定义类的__iter__
以实现您的目的。
def __iter__(self):
yield self.value
yield self.attributes
o = MyClass()
tuple(o)