Descritor em Python

| | | | | | | | | | |

Protocolo do descritor:
Em outras linguagens de programação, os descritores são chamados setter e getter, onde funções públicas são usadas para obter e definir uma variável privada. Python não tem conceito de variáveis privadas, e o protocolo descritor pode ser pensado como uma maneira Pythonic de conseguir algo assim. Descritores — é uma nova maneira de implementar classes em Python e não precisa herdar nada de um objeto específico. Para implementar descritores facilmente em python, devemos usar pelo menos um dos métodos definidos acima. Observe que a instância abaixo retorna o objeto que foi acessado pelo atributo e que o proprietário é a classe na qual o handle foi atribuído como atributo. Existem três protocolos no descritor Python para setters, getters e um método delete.

  • gfg .__ get __ (self, obj, type = None) : Este atributo é chamado quando você deseja obter as informações (value = obj.attr) e o que quer que ele retorne é — é isso que será passado para o código que solicitou o valor do atributo.
  • gfg .__ set __ (self, obj, value) : Este método é chamado para definir os valores de atributo ‚Äã‚Äã(obj .attr = &# 39; valor ') e não retornará nada para você.
  • gfg .__ delete __ (self, obj) : Este método é chamado quando um atributo é removido de um objeto (del obj.attr)

Invocação do descritor:
Os descritores são invocados automaticamente quando uma invocação é recebida para o método set() ou >get() método. Por exemplo, obj.gfg procura por gfg no dicionário obj . Se gfg define um método __get __ () , então gfg .__ get __ (obj) . Ele também pode ser chamado diretamente pelo nome do método, ou seja, gfg .__ get __ (obj) .


# Mostrar programa Python
# como chamar o descritor

def __ getattribute __ ( self , key):

v = objeto .__ getattribute __ ( self , key)

if hasattr ( v, `__get__` ):

return v .__ get __ ( Nenhum , self )

return v

Pontos importantes a serem lembrados:

  • Os descritores são chamados pelo método __getattribute __ () .
  • A substituição de __getattribute__ () evita chamadas automáticas para o descritor.
  • object .__ getattribute __ () e type .__ getattribute __ () várias chamadas para __get __ ( ) .
  • Os descritores de dados sempre substituem os dicionários de instância.
  • Descritores que não são de dados podem ser substituídos por dicionários de instância.

Um exemplo de descritor:
Neste exemplo, um descritor de dados normalmente configura e retorna valores ‚Äã‚Äãe imprime uma mensagem logando seu acesso.
Código 1:


classe Descritor ( objeto ):

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

self . nome = nome


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

return " {} para {} " . formato ( self .name, self . name)

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

if isinstance (name, str ):

self . nome = nome

else :

raise TypeError ( " O nome deve ser string " )


class GFG ( objeto ):

nome = Descritor ()

g = GFG()

g.name = "Geeks"

imprimir (g.name)

Sair:

Python.Engineering

Código 2:


< tbody>

class Descritor ( objeto ):


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

self . nome = nome


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

return "{} para {}" . formato ( self . nome, self . name)


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

if isinstance ( name, str ):

self . name = name

else :

raise TypeError ( "Nome deve ser string" )


class GFG ( objeto ):

nome = Descritor ()


g = GFG()

g.name = "Computador"

print ( g.name)

Sair:

 ComputerforComputer 

Crie um identificador usando a propriedade ():
propriedade () , é fácil criar um descritor utilizável para qualquer atributo. Sintaxe para criar a propriedade property()

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

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

# Programa Python para explicar a propriedade ( ) function


# Classe do alfabeto

class Alfabeto:

def __ init __ ( self , valor):

self ._ value = valor


# obtendo valores ‚Äã‚Äã

def getValue ( se lf ):

print ( `Obtendo valor` )

return self ._ value


# valores de instalação ‚Äã‚Äã

def setValue ( self , valor):

print ( `Definindo valor para` + valor)

self ._ value = valor


# remo ve valores ‚Äã‚Äã

def delValue ( self ):

print ( `Excluindo valor` )

del self ._ value


valor = propriedade (getValue, setValue, delValue,) >


# passa o valor

x = Alfabeto ( `GeeksforGeeks` )

print (x.value)


x.value = `GfG`

del x.value

Sair:

 Obtendo valor Python.Engineering Configurando valor para GfG Excluindo valor 

Gerando um descritor usando métodos de classe:
Nisto criamos Vamos pegar a classe e substituir qualquer um dos métodos do descritor __set__ , __ get__ e __delete__ . Este método é usado quando o mesmo descritor é necessário para muitas classes e atributos diferentes, por exemplo, para verificação de tipo.


class Descritor ( objeto ):

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

self .name = nome

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

return " {} para {} " . formato ( self . nome, self . name)


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

if isinstance (name, str ):

self . nome = nome

else :

raise TypeError ( "O nome deve ser string" )


class GFG ( object ):

nome = Descritor ()


g = GFG ( )

g.name = "Geeks" "

print (g.name)

Saída:

 Python.Engineering 

Crie um descritor usando @property Decorator:
Neste usamos o poder dos decoradores de propriedade, que são uma combinação de um método de tipo de propriedade e decoradores Python.


classe Alfabeto:

def __ init __ ( self , valor):

self ._ valor = valor


# recuperando valores ‚Äã‚Äã

@ property

def valor ( self ):

print ( `Obtendo valor` )

return self ._ valor

# valores de configuração ‚Äã‚Äã

@ value . setter

def valor ( self , value ):

print ( `Definindo valor para ` + valor)

self ._ value = valor


# remove valores ‚Äã‚Äã

@ value .deleter

def valor ( self ):

imprimir ( `Excluindo valor` )

del self ._ value



# passe o valor

x = Alfabeto ( `Pedro` )

print (x.value)


x.value = `Diesel`


del x.value

Sair:

 Obtendo valor Peter Configurando valor para Diesel Excluindo valor 

Shop

Learn programming in R: courses

$

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

$

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