Python

Урок за дескриптори на Python

Урок за дескриптори на Python
Полезна техника за писане на родов код, който може да се използва повторно между класовете, се поддържа от дескриптори на Python или по-известни като дескриптори. Те може да звучат близо до понятието наследство, но не са. Това е директна техника за улавяне на достъп до атрибути със задължителен характер. Дескрипторите са основна функция на Python, която управлява голяма част от магьосничеството, скрито под прикритието на езика. Ако някога сте усещали, че дескрипторите на Python с малко функционални реализации са усъвършенствана тема, тогава този урок е най-добрата платформа, която ще ви накара да разберете тази мощна функция.

Методи на дескриптора

За да го заявя ясно, клас, който изпълнява __get_ (), __комплект()_, или __Изтрий()_ функцията на дескрипторен протокол за обект се класифицира като „дескриптор“. За да се управляват параметрите на различни класове, които използват обекта като референция, се правят дескриптори на Python. Ето три посочени метода, които ще бъдат използвани в дескрипторите:

__get __ (): Когато се опитате да извлечете данните, __get __ () извиква се атрибут и каквото и да предоставя, това ще бъде предоставено на кода, изискващ стойността на една променлива. Той е категоризиран като дескриптор без данни и е четим само.

__комплект__(): Функцията __комплект__() се извиква за коригиране на стойностите на параметрите и нищо не ви се връща от тази функция. Той е известен като дескриптор на данни, който е не само четим, но и записваем.

__Изтрий__(): Винаги, когато параметърът бъде премахнат от обект, __Изтрий__() функция се извиква. Той е известен като дескриптор на данни, който е не само четим, но и записваем.

Трябва да приложите протокола на дескриптора само ако използвате дескриптори на Python във вашия скрипт. Най-важните функции на протокола са получи () и комплект() с последващ подпис.

__get __ (self, obj, type = None) -> обект
__set __ (self, obj, value) -> Няма

себе си е екземпляр на дескриптора.
обект е екземпляр на обекта, към който е свързан вашият дескриптор.
Тип е видът на обекта.

Пример:

Тук дефинирахме два класа. В класа Descriptor имаме дефинирани методи на дескриптор. В вземи (), самото е екземпляр за дескриптора 'val', той ще получи стойност 'Geeks' и ще го съхрани. След това ще направи низ с 'for', прикрепен между предоставения атрибут. клас Дескриптор (обект):

def __get __ (self, obj, objtype):
връщане „ за “.формат (самостоятелно.вал, себе си.вал)

След това ще върне стойността към метода set (). След това тази функция проверява за стойността, независимо дали е низ или не. В случай, че стойността е низ, тя ще бъде записана в атрибут с име „val“. Ако стойността не е низ, тя ще изведе изключение.

def __set __ (self, obj, val):
if isinstance (val, str):
себе си.val = вал
друго:
повишаване на TypeError („Името трябва да бъде низ“)

След това стойността ще бъде отпечатана като низ „GeeksforGeeks“.

клас GFG (обект):
val = Дескриптор ()
g = GFG ()
ж.val = „Отрепки“
печат (g.вал)

Когато се опитате да стартирате този код, ще получите следния изход:

GeeksforGeeks

Предназначение на дескрипторите

Нека опишем клас с име „дом“ с три характеристики, а именно: loc, area и price. Можете да използвате функцията __в него__() за инициализиране на атрибутите на класа.

клас вкъщи:

def __init __ (self, loc, area, price):

След това можете да използвате функцията __str __ (), която може да върне резултата от трите атрибута, които бихте могли да предадете на класа при изграждането на елемента. Функцията __str __ () ще върне низа.

Когато изпълните този код, той ще покаже привидно правилния изход.

Сега нека се опитаме да променим цената на дома до отрицателна стойност, както е показано по-долу, и да изпълним кода.

Няма никаква промяна, с изключение на отрицателния знак, както е показано в резултата. Дръж се! Тук нещо не е наред, нали? Как така цената на жилището е отрицателна. Python го позволява, защото Python е гъвкава среда за разработка, която специално не позволява проверка на типа.

Нека инициализираме оператор 'if' в __в него__() функция за повишаване на изключение, ако стойността или цената е по-малка от нула.

Към момента може да забележите, че се представя добре и ако цената е по-малка от нула, кодът генерира грешка в стойността.

Както можем да разберем, __в него_() function е конструктор и се извиква само веднъж, когато правите обект на клас. Следователно по-късно персонализираната проверка на типа ще се провали. Python предоставя дескриптори, които са специализирани в подпомагането на решаването на всички горепосочени проблеми. Сега, нека започнем да използваме дескриптори в същия пример, за да го разберем добре.

Класът на дескриптора " __в него_() функцията има локална променлива __price на 0. В началото му двойното подчертаване означава, че параметърът е частен. Използва се за разграничаване на параметъра за цена на класа Descriptor от домашния клас.

The __get __ () метод ще върне цената. Екземплярът на атрибута съдържа h1, който е екземпляр на дескриптор. Собственикът на атрибута се позовава на името на класа „дом“ и връща цената.

Функцията __комплект__() има атрибут инстанция който съдържа h1 и стойност, която трябва да бъде присвоена. Проверката се използва за потвърждаване на стойността. Ако стойността е цяло число, тя ще бъде разпечатана, в противен случай кодът с изключение за грешка на типа. Ако стойността е под нулата, изключението за грешка в стойността ще бъде хвърлено в кода.

The __Изтрий__() функция се изпълнява, когато атрибутът на параметъра е премахнат от обект.

Домашният клас остава същият, въпреки че инстанцията цена от клас Descriptor () се добавя. В __в него_() функция, добавете атрибута price към цената на екземпляра и тя ще извика __комплект_() функция.

Докато изпълнявате този код, той ще ви даде грешка в стойността, защото цената никога не може да бъде нула.

Сега се опитайте да изпълните кода със стойност на низ.

Това ще изведе изключение за грешка в типа.

Съществуващата стойност на екземпляра се заменя при формирането на нов екземпляр, тъй като дескрипторите са свързани с класа, а не с екземпляра. Погледнете по-долу:

Първата стойност е заменена с втората.

Заключение

Можем да разберем защо дескрипторите от Python са станали толкова завладяваща тема и към какви сценарии на използване можете да ги добавите, като прегледате този урок.

Пренастройте бутоните на мишката си по различен начин за различен софтуер с X-Mouse Button Control
Може би се нуждаете от инструмент, който може да промени контрола на мишката с всяко приложение, което използвате. Ако случаят е такъв, можете да изпр...
Преглед на безжична мишка на Microsoft Sculpt Touch
Наскоро прочетох за Microsoft Sculpt Touch безжична мишка и реших да я купя. След като го използвах известно време, реших да споделя опита си с него. ...
Екранен тракпад и указател на мишката на AppyMouse за таблети с Windows
Потребителите на таблети често пропускат показалеца на мишката, особено когато са привични да използват лаптопите. Смартфоните и таблетите със сензоре...