Дескрипторлор жана атрибут сыйкыры
obj.attr чын эле эмне кылганын көзөмөлгө алыңыз
Негизги идея: Сиз
obj.attr деп жазган сайын Python бул маанини кайдан аларын чечкен кичине алгоритмди аткарат. Үч механизм бул алгоритмди өзгөртүүгө мүмкүндүк берет: дескриптор протоколу (__get__/__set__/__delete__) класстын атрибутуна кайра колдонулуучу окуу/жазуу логикасын байлайт; __getattr__ жана __getattribute__ экземплярдын атрибуттарына кайрылууну кармайт; ал эми __slots__ ар бир экземплярдын __dict__ ордуна туруктуу компакт жайгашууну коёт. Буларды өздөштүрсөңүз, property, classmethod, ORM жана dataclasses кантип курулганын түшүнөсүз.
Сабактын аягында сиз:
- Python
obj.attrчечкен так тартипти тактай аласыз, __get__,__set__жана__set_name__менен кайра колдонулуучу дескриптор жаза аласыз,- data-дескрипторлорду non-data-дон айырмалап, ким экземпляр сөздүгүн жеңерин болжой аласыз,
__getattr__ди запастык маани үчүн колдонуп, эмне үчүн__getattribute__коркунучтуу экенин билесиз,- эстутумду үнөмдөө жана атрибуттарды бекитүү үчүн
__slots__ту компромисстери менен колдоно аласыз.
1. obj.attr учурунда чын эле эмне болот
Атрибутка кирүү жөнөкөй сөздүктөн издөө эмес. obj.attr окуу type(obj).__getattribute__(obj, "attr") ди чакырат, ал эми object дагы демейки ишке ашыруу так тартипти карманат. Бул тартипти түшүнүү бүт теманын пайдубалы.
- Python
attrди издеп типтин MRO (методдорду чечүү тартиби) боюнча жүрөт. Эгер data-дескриптор болгон класс атрибуту табылса (__set__же__delete__аныктайт), ал дескриптор дароо жеңип, анын__get__иштейт. - Болбосо Python экземплярдын өз
__dict__ин текшерет. Эгерattrошол жерде болсо, ошол маани кайтарылат. - Болбосо -- MRO дон табылган класс атрибутуна кайра: эгер ал non-data-дескриптор болсо (болгону
__get__) же жөнөкөй маани болсо, ал колдонулат. - Эч нерсе табылбаса, Python эң акыркы амал катары
__getattr__ди чакырат. Ал да жок болсо,AttributeErrorкөтөрүлөт.
Эң маанилүү жыйынтык: класстагы data-дескриптор экземпляр сөздүгүн жеңет, бирок non-data-дескриптор экземпляр сөздүгүнө утулат. Ушул бир эреже "менин атрибутум эмне үчүн ушундай кылды?" деген сюрприздердин көбүн түшүндүрөт.