Deskryptor w Pythonie

| | | | | | | | | | |

Protokół deskryptorów:
W innych językach programowania deskryptory są nazywane ustawiającymi i pobierającymi, gdzie funkcje publiczne są używane do pobierania i ustawiania zmiennej prywatnej. Python nie ma pojęcia o zmiennych prywatnych, a protokół deskryptorów może być traktowany jako pythoniczny sposób na osiągnięcie czegoś takiego. Deskryptory — jest to nowy sposób implementacji klas w Pythonie i nie musi dziedziczyć niczego z konkretnego obiektu. Aby łatwo zaimplementować deskryptory w Pythonie, musimy użyć przynajmniej jednej z metod zdefiniowanych powyżej. Należy zauważyć, że poniższa instancja zwraca obiekt, do którego uzyskano dostęp za pomocą atrybutu, a właścicielem jest klasa, w której dojście zostało przypisane jako atrybut. W deskryptorze Pythona istnieją trzy protokoły dla ustawiających, pobierających i metody usuwania.

  • gfg .__ get __ (self, obj, type = None) : Ten atrybut jest wywoływany, gdy chcesz uzyskać informacje (value = obj.attr) i cokolwiek zwraca, to — to właśnie zostanie przekazane do kodu, który zażądał wartości atrybutu.
  • gfg .__ set __ (self, obj, value) : Ta metoda jest wywoływana w celu ustawienia wartości atrybutów ‚Ęã‚Ęã(obj .attr = &# 39; value ') i nic Ci nie zwróci.
  • gfg .__ delete __ (self, obj) : Ta metoda jest wywoływana, gdy atrybut jest usuwany z obiektu (del obj.attr)

Wywołanie deskryptora:
Deskryptory są wywoływane automatycznie po odebraniu wywołania dla metody set() lub pobierz () metodę. Na przykład obj.gfg szuka gfg w słowniku obj . Jeśli gfg definiuje metodę __get __ () , to gfg .__ get __ (obj) . Można go również wywołać bezpośrednio przez nazwę metody, tj. gfg .__ get __ (obj) .


# Pokaż program w Pythonie
# jak wywołać deskryptor

def __ getattribute __ ( self , klucz):

v = object .__ getattribute __ ( self , klucz)

if hasattr ( v, `__get__` ):

return v .__ get __ ( Brak , self )

return v

Ważne punkty do zapamiętania:

  • Deskryptory są wywoływane przez metodę __getattribute __ () .
  • Zastąpienie __getattribute__ () zapobiega automatycznym wywołaniom deskryptora.
  • object .__ getattribute __ () i type .__ getattribute __ () różne wywołania __get __ ( ) .
  • Deskryptory danych zawsze zastępują słowniki instancji.
  • Deskryptory niebędące danymi mogą być nadpisane przez słowniki instancji.

Przykład deskryptora:
W tym przykładzie deskryptor danych zwykle ustawia i zwraca wartości „Ęã”ãi wypisuje komunikat logujący ich dostęp.
Kod 1:


class Deskryptor ( obiekt ):

def __ init __ ( self , nazwa = ` `):

self . name = name


def __ get __ ( self , obj, objtype):

return " {} for {} "< /kod> . format ( self .name, self . name)

def __ set __ ( self , obj, name):

if isinstance (nazwa, str ):

self . name = name

else :

raise TypeError ( " Nazwa powinna być ciągiem " )


class GFG ( object ):

nazwa = Deskryptor ()

g = GFG ()

g.name = "Geeks"

print (g.name)

Wyjście:

Python.Engineering

Kod 2:


< tbody>

class Deskryptor ( obiekt ):


def __ init __ ( self , nazwa = ` `):

self . name = name


def __ get __ ( self , obj, objtype):

return "{} for {}" . format ( self . name, self . name)


def __ set __ ( self , obj, nazwa ):

if isinstance ( nazwa, str ):

self . name = name

else :

raise TypeError ( "Nazwa powinna być ciągiem" )


class GFG ( obiekt ):

nazwa = Deskryptor ()


g = GFG ()

g.name = "Komputer"

drukuj ( g.name)

Wyjście:

 ComputerforComputer 

Utwórz uchwyt za pomocą właściwości ():
właściwość () , łatwo jest utworzyć użyteczny deskryptor dla dowolnego atrybutu. Składnia tworzenia właściwości property()

 (fget = None, fset = None, fdel = None, doc = None) 

< table border = "0" cellpadding = "0" cellpacing = "0">

# Program w Pythonie wyjaśniający właściwość ( ) funkcja


# Klasa alfabetu

klasa Alfabet:

def __ init __ ( self , wartość):

self ._ wartość = wartość


# pobieranie wartości ‚Ęã‚Ęã

def getValue ( se lf ):

print ( `Pobieranie wartości` )

return self wartość ._


# wartości instalacji ‚Ęã‚Ęã

def setValue ( self , wartość):

print ( `Ustawianie wartości na` + wartość)

self ._ wartość = wartość


# remo ve wartości ‚Ęã‚Ęã

def delValue ( self ):

print ( `Usuwanie wartości` )

del self wartość ._


wartość = właściwość (getValue, setValue, delValue,)


# przekaż wartość

x = Alfabet ( `GeeksforGeeks` )

print (x.value)


x.value = `GfG`

del x.value

Wyjście:

 Pobieranie wartości Python.Engineering Ustawianie wartości na GfG Usuwanie wartości 

Generowanie deskryptora przy użyciu metod klas:
W tym celu utworzyliśmy Pobierz klasę i zastąpmy dowolne metody deskryptora __set__ , __ get__ i __delete__ . Ta metoda jest używana, gdy ten sam deskryptor jest wymagany dla wielu różnych klas i atrybutów, na przykład do sprawdzania typu.


class Deskryptor ( obiekt ):

def __ init__ ( self , nazwa = ` `):

self .name = nazwa

def __ get __ ( self , obj, objtype):

return " {} for {} " . format ( self . name, self . name)


def __ set __ ( self , obj, nazwa ):

if isinstance (nazwa, str ):

self . name = name

else :

podniesienie TypeError ( "Nazwa powinna być ciągiem" )


class GFG ( object ):

nazwa = Deskryptor ()


g = GFG ( )

g.name = "Geeks "

print (g.name)

< /kod>

Wynik:

 Python.Engineering 

Utwórz deskryptor za pomocą @property Decorator:
W tym używamy mocy dekoratorów właściwości, które są kombinacją metody typu właściwości i dekoratorów Pythona.


class Alfabet:

def __ init __ ( self , wartość):

self ._ wartość = wartość


# przez pobranie wartości ‚Ęã‚Ęã

@ property

def wartość ( self ):

print ( `Pobieranie wartości` )

return self wartość ._

# wartości ustawień ‚Ęã‚Ęã

@ wartość . setter

def wartość ( self , value ):

print ( `Ustawianie wartości na ` + value)

self ._ wartość = wartość


# usuń wartości ‚Ęã‚Ęã

@ value .deleter

def wartość ( self ):

drukuj ( `Usuwanie wartości` )

del self wartość ._



# przekaż wartość

x = Alfabet ( `Piotr` )

print (x.value)


x.value = `Diesel`


del x.value

Wyjście:

 Pobieranie wartości Peter Ustawienie wartości na Diesel Usuwanie wartości 

Deskryptor w Pythonie __del__: Questions

Deskryptor w Pythonie __delete__: Questions

Shop

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Best laptop for Zoom

$499

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers

Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method