Код демонстрирует работу дескриптора не данных. Класс 𝙳 определяет только метод __𝚐𝚎𝚝__, но не определяет __𝚜𝚎𝚝__, что делает его дескриптором не данных.
Марк Лутц «Изучаем Python», глава 40:
«И наоборот, если этот дескриптор не определяет __𝚜𝚎𝚝__, то имя в словаре экземпляра скроет имя в классе согласно нормальному наследованию».
В коде происходит следующее:
🔘 Создается экземпляр 𝙸 класса 𝙲
🔘 При обращении к 𝙸.𝚍 вызывается метод __𝚐𝚎𝚝__ дескриптора 𝙳𝟸, выводится '__𝚐𝚎𝚝__'
🔘 В словарь экземпляра 𝙸.__𝚍𝚒𝚌𝚝__ добавляется ключ '𝚍' со значением '𝚜𝚙𝚊𝚖'
🔘 При повторном обращении к 𝙸.𝚍 имя '𝚍' в словаре экземпляра скрывает дескриптор в классе, поэтому выводится '𝚜𝚙𝚊𝚖'
>>> 𝙸.𝚍 # Доступ к унаследованному дескриптору не данных
__𝚐𝚎𝚝__
>>> 𝙸.__𝚍𝚒𝚌𝚝__['𝚍'] = '𝚜𝚙𝚊𝚖'
>>> 𝙸.𝚍 # Скрываем имя в классе согласно правилам нормального наследования экземпляров
'𝚜𝚙𝚊𝚖'
Это отличается от дескрипторов данных, которые перекрывают имена в словаре экземпляра благодаря наличию метода __𝚜𝚎𝚝__.
Post #4334
631
- 👍 2
- 🤡 2
- 👎 1