Metody deskriptorů
Abychom to jasně řekli, třída, která se implementuje __dostat_(), __soubor()_, nebo __vymazat()_ funkce deskriptorového protokolu pro objekt je klasifikována jako „deskriptor“. K řízení parametrů různých tříd, které používají objekt jako odkaz, jsou vytvořeny deskriptory Pythonu. Tady jsou tři zadané metody, které budou použity v deskriptorech:
__dostat__(): Když se pokusíte extrahovat data, __dostat__() atribut se nazývá a cokoli poskytuje, je to, co by bylo poskytnuto kódu požadující hodnotu jedné proměnné. Je kategorizován jako deskriptor bez údajů a je pouze čitelný.
__soubor__(): Funkce __soubor__() je volána k úpravě hodnot parametrů a tato funkce vám nic nevrátí. Je známý jako deskriptor dat, který je nejen čitelný, ale také zapisovatelný.
__vymazat__(): Kdykoli je parametr z objektu odstraněn, __vymazat__() funkce se volá. Je známý jako deskriptor dat, který je nejen čitelný, ale také zapisovatelný.
Protokol deskriptoru musíte vynutit pouze v případě, že ve svém skriptu používáte deskriptory Pythonu. Nejvýznamnější funkce protokolu jsou dostat() a soubor() s následným podpisem.
__get __ (self, obj, type = None) -> objekt
__set __ (self, obj, value) -> None
já je instance deskriptoru.
obj je instance objektu, ke kterému je váš deskriptor připojen.
typ je typ objektu.
Příklad:
Zde jsme definovali dvě třídy. Ve třídě Deskriptor jsme definovali metody deskriptorů. V dostat() metoda, já je instance pro deskriptor 'val', dostane hodnotu 'Geeks' a uloží ji. Pak udělá řetězec s 'pro' připojeným mezi poskytnutým atributem. deskriptor třídy (objekt):
def __get __ (self, obj, objtype):
vrátit „ pro “.formát (vlastní.val, já.val)
Poté vrátí hodnotu metodě set (). Tato funkce poté zkontroluje hodnotu, ať už jde o řetězec nebo ne. V případě, že hodnota je řetězec, bude uložen do atributu s názvem 'val'. Pokud hodnota není řetězec, vyvolá výjimku.
def __set __ (self, obj, val):
if isinstance (val, str):
já.val = val
jiný:
zvýšit TypeError („Název by měl být řetězec“)
Poté bude hodnota vytištěna jako řetězec 'GeeksforGeeks'.
třída GFG (objekt):
val = Deskriptor ()
g = GFG ()
G.val = “Geekové”
tisk (např.val)
Při pokusu o spuštění tohoto kódu získáte následující výstup:
GeeksforGeeks
Účel deskriptorů
Popíšeme třídu s názvem „domov“ se třemi charakteristikami, konkrétně: loc, area a price. Tuto funkci můžete použít __init __ () inicializovat atributy třídy.
třída doma:
def __init __ (self, loc, area, price):
Potom můžete použít funkci __str __ (), která by mohla vrátit výsledek tří atributů, které byste mohli předat třídě při vytváření položky. Funkce __str __ () vrátí řetězec.
Když tento kód spustíte, zobrazí se zdánlivě správný výstup.
Zkusme nyní změnit cenu domu na zápornou hodnotu, jak je uvedeno níže, a spusťte kód.
Neexistuje vůbec žádná změna, s výjimkou záporného znaménka, jak je znázorněno na výstupu. Vydrž! Něco tu je, že?? Jak to, že cena domu je negativní. Python to umožňuje, protože Python je univerzální vývojové prostředí, které konkrétně neumožňuje kontrolu typu.
Pojďme inicializovat příkaz 'if' v __init __ () funkce pro vyvolání výjimky, pokud je hodnota nebo cena menší než nula.
Od této chvíle si můžete všimnout, že funguje dobře, a pokud je cena nižší než nula, generuje kód chybu hodnoty.
Jak jsme mohli pochopit, __init_ () funkce je konstruktor a je vyvolána pouze jednou, když vytváříte objekt třídy. Proto by později selhala přizpůsobená kontrola typu. Python poskytuje deskriptory, které se specializují na řešení všech výše uvedených problémů. Začněme nyní používat deskriptory ve stejném příkladu, abychom tomu dobře porozuměli.
Třída deskriptoru ' __init_ () funkce má lokální proměnnou __price na 0. Na začátku dvojité podtržítko znamená, že parametr je soukromý. Používá se k odlišení parametru ceny deskriptorové třídy od domácí třídy.
The __dostat__() metoda vrátí cenu. Instance atributu obsahuje h1, což je instance deskriptoru. Vlastník atributu odkazuje na název třídy „domov“ a vrátí cenu.
Funkce __soubor__() má atribut instance který obsahuje h1 a hodnotu, která má být přiřazena. Kontrola slouží k potvrzení hodnoty. Pokud je hodnota celé číslo, vytiskne se, jinak kód s vyvoláním výjimky Type Error. Pokud je hodnota pod nulou, bude do kódu vyvolána výjimka Chyba hodnoty.
The __vymazat__() funkce je provedena, když je atribut parametru odstraněn z objektu.
Domácí třída zůstává stejná, ačkoli instance cena třídy Descriptor () je přidán. V __init_ () funkce, přidejte atribut ceny k ceně instance a zavolá __soubor_() funkce.
Při spuštění tohoto kódu vám dá chybu hodnoty, protože cena nikdy nemůže být nulová.
Nyní zkuste spustit kód s hodnotou řetězce.
Vyvolá výjimku Chyba typu.
Stávající hodnota instance je přepsána při vytváření nové instance, protože deskriptory se vztahují ke třídě a nikoli k instanci. Podívejte se níže:
První hodnota byla přepsána druhou.
Závěr
Můžeme pochopit, proč se deskriptory z Pythonu staly tak fascinujícím tématem a do jakých scénářů použití je můžete přidat procházením tohoto tutoriálu.