Есть ли какие-то «ошибки» с этим шаблоном Python? - PullRequest
6 голосов
/ 16 февраля 2011

Вот пример, который я собираюсь использовать:

class Dicty(dict): 
    def __init__(self): 
         self.__dict__ = self 

d = Dicty()
d.foo = 'bar' 
print d['foo']
>>> bar 
d['foo'] = 'baz'
print d.foo
>>> 'baz'

Обычно я предпочитаю семантику доступа к атрибутам объекта, а не к dict get / set, но есть некоторые обстоятельства, когда требуется диктовочный доступ (например, d['foo-bar'] = 'baz'), и я бы предпочел не иметь специального getter Методы установки для этих случаев, таким образом, двойственное поведение dict & object одновременно с общими атрибутами.

Есть ли какие-нибудь ошибки с вышеуказанным рисунком?

Ответы [ 3 ]

7 голосов
/ 16 февраля 2011

Вот менее «хакерский» способ достижения того же эффекта:

class Dicty(dict):
    def __getattr__(self, key):
        return self[key]

    def __setattr__(self, key, value):
        self[key] = value

Я думаю, , что ваш путь тоже может работать нормально, но установив атрибут __dict__это кажется немного ненадежным по стилю, и он должен поднять некоторые вопросы, если кто-то еще закончит читать ваш код.

3 голосов
/ 16 февраля 2011

Не задано self.__dict__.Звоните __init__(self, *args, **kwargs) по суперклассу.Кроме того, dict наследуется от object, поэтому вам не нужно указывать его.

2 голосов
/ 16 февраля 2011

Пара вещей.Во-первых, если вы попытаетесь использовать метод словаря, такой как keys, вы не сможете получить его сейчас.Я столкнулся с некоторыми другими проблемами, такими как маринование и копирование.

Но я реализовал что-то, что делает это без этих проблем.Вы можете увидеть это здесь, это класс AttrDict в модуле dictlib.py .Этот модуль также содержит класс, который может переносить другой объект стиля отображения в тех случаях, когда он не может быть разделен на подклассы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...