(Как) Можно ли отменить дескрипторы встроенных типов, доступные только для чтения? - PullRequest
0 голосов
/ 06 мая 2019

Возможно ли получить доступ к атрибуту, который установлен как недоступный?Например, чтобы установить новый get метод для dict?

Я пытаюсь получить большую и иногда запутанную кодовую базу.Чтобы получить представление о вещах, я пытался украсить некоторые методы для печати журнала при каждом их вызове.Декораторы Python (которые на самом деле не украшают, я знаю) прекрасно работают, чтобы обернуть наши собственные методы, но когда я попытался (на этот раз действительно) декорировать dict.get, возникла проблема.Я ожидал, что my_dict.get = my_wrapper(my_dict.get) будет работать нормально, но получил AttributeError с сообщением 'dict' object attribute 'get' is read-only.

Согласно моим исследованиям, это означает, что dict использует дескриптор для обработки присваивания (т.е.поднять Исключение из его обращения).Я пытался подключиться к самому дескриптору или к __dict__ из dict, но ничего не помогло, и я не смог найти ни одного источника, который был бы достаточно детализирован, чтобы быть полезным.

Подклассы - это обходной путь и, вероятно,Я всегда думал, что в Python можно получить доступ ко всему и подключиться к чему-либо, и что помешать пользователям что-то сделать - это просто заставить их подумать дважды, прежде чем делать что-то более острое или делать что-либо в любом случае, на этот раз более явно.Это неправильное представление, или я упустил что-то, что заставляет dict_instance.get = my_wrapper(dict_instance.get) работать?

Python может влиять на вещи и ему не нужен новый класс только для изменения одного атрибута одного экземпляра, возможно, нарушая код, который полагаетсяна точный тип этого экземпляра, верно?

...