覆盖对象

时间:2017-07-10 09:44:49

标签: python

我可以使用__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?

2 个答案:

答案 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)