Давайте немного прокачаем стандартный словарь. Зачем? А потому что Python это позволяет)))
Добавим возможность работать с ключами словаря как с атрибутами объекта. Для этого нам потребуется определить три метода:
__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