Добавим возможность работать с ключами словаря как с атрибутами объекта. Для этого нам потребуется определить три метода:
__getattr__ - получение атрибута__setattr__ - изменение атрибута__delattr__ - удаление атрибутаНаследоваться будем от стандартного словаря
class _AttribDict(dict):Подменяем стандартный словарь в одну строку
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, value):
self[name] = value
def __delattr__(self, name):
del self[name]
__import__('builtins').__dict__['dict'] = _AttribDict
Всё, можно тестить 😬>>> obj = dict(name='Object1', id=14)Выглядит как обычный словарь
>>> print(obj)
{'name': 'Object1', 'id': 14}
>>> obj['name'] = 'Thing 1'Изменение ключей работает. То есть стандартное поведение не сломали. А теперь попробуем обратиться к атрибутам
>>> print(obj['name'])
Thing 1
>>> print(obj.name)Пробуем изменить ключ через атрибут
Thing 1
>>> obj.name = 'Thing 2'И удаляем ключ через атрибут
>>> print(obj.name)
Thing 2
del obj.nameТеперь с ключами словаря можно работать и обычным способом:
print(obj)
{'id': 14}
dict['key']и как с атрибутами:
dict.keyВыглядит интересно.
Но помните , если Python позволяет это делать, это не значит что это можно делать 👮♂️!
Подобные эксперименты лучше оставить для развлечения и не допускать в прод.
Хорошая разминка, не более того.
#tricks