Мазмунга өтүү

Дескрипторлор жана атрибут сыйкыры

Сабактын башталышы

Дескрипторлор жана атрибут сыйкыры

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 дагы демейки ишке ашыруу так тартипти карманат. Бул тартипти түшүнүү бүт теманын пайдубалы.

  1. Python attr ди издеп типтин MRO (методдорду чечүү тартиби) боюнча жүрөт. Эгер data-дескриптор болгон класс атрибуту табылса (__set__ же __delete__ аныктайт), ал дескриптор дароо жеңип, анын __get__ иштейт.
  2. Болбосо Python экземплярдын өз __dict__ ин текшерет. Эгер attr ошол жерде болсо, ошол маани кайтарылат.
  3. Болбосо -- MRO дон табылган класс атрибутуна кайра: эгер ал non-data-дескриптор болсо (болгону __get__) же жөнөкөй маани болсо, ал колдонулат.
  4. Эч нерсе табылбаса, Python эң акыркы амал катары __getattr__ ди чакырат. Ал да жок болсо, AttributeError көтөрүлөт.

Эң маанилүү жыйынтык: класстагы data-дескриптор экземпляр сөздүгүн жеңет, бирок non-data-дескриптор экземпляр сөздүгүнө утулат. Ушул бир эреже "менин атрибутум эмне үчүн ушундай кылды?" деген сюрприздердин көбүн түшүндүрөт.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө