Как изменить поведение dict () для экземпляра

Итак, я пишу класс, расширяющий словарь, который прямо сейчас использует метод "dictify" для преобразования себя в dict . Вместо этого я хотел бы изменить его так, чтобы вызов dict () для объекта приводил к тому же поведению, но я не знаю, какой метод переопределить. Это невозможно, или мне не хватает чего-то совершенно очевидного? (И да, я знаю, что приведенный ниже код не работает, но я надеюсь, что он иллюстрирует то, что я пытаюсь сделать.)

from collections import defaultdict

class RecursiveDict(defaultdict):
    '''
    A recursive default dict.

    >>> a = RecursiveDict()
    >>> a[1][2][3] = 4
    >>> a.dictify()
    {1: {2: {3: 4}}}
    '''
    def __init__(self):
        super(RecursiveDict, self).__init__(RecursiveDict)

    def dictify(self):
        '''Get a standard dictionary of the items in the tree.'''
        return dict([(k, (v.dictify() if isinstance(v, dict) else v))
                     for (k, v) in self.items()])

    def __dict__(self):
        '''Get a standard dictionary of the items in the tree.'''
        print [(k, v) for (k, v) in self.items()]
        return dict([(k, (dict(v) if isinstance(v, dict) else v))
                     for (k, v) in self.items()])

РЕДАКТИРОВАТЬ: Чтобы показать проблему более ясно:

>>> b = RecursiveDict()
>>> b[1][2][3] = 4
>>> b
defaultdict(<class '__main__.RecursiveDict'>, {1: defaultdict(<class '__main__.RecursiveDict'>, {2: defaultdict(<class '__main__.RecursiveDict'>, {3: 4})})})
>>> dict(b)
{1: defaultdict(<class '__main__.RecursiveDict'>, {2: defaultdict(<class '__main__.RecursiveDict'>, {3: 4})})}
>>> b.dictify()
{1: {2: {3: 4}}}

Я хочу, чтобы dict (b) был то же, что и b.dictify ()

18
задан Ceasar Bautista 17 May 2012 в 21:45
поделиться