¿Qué hace el descriptor de Python?
Qué es un descriptor
Definición oficial: un descriptor es un atributo de objeto con "comportamiento vinculante". Al acceder (obtener, configurar y eliminar) sus propiedades, en realidad se llaman métodos especiales (_get_(), _set_(), _delete_()). Es decir, si un objeto define cualquiera de estos tres métodos, entonces es un descriptor.
La función del descriptor es representar los atributos de la clase. Cabe señalar que el descriptor no se puede definir en el constructor de la clase utilizada. Solo se puede definir como un atributo de la clase. Solo pertenece a la clase y no pertenece a una instancia, podemos confirmarlo consultando el diccionario de instancias y clases.
Los descriptores son el medio para implementar la mayoría de las características de la clase Python en la estructura de datos de nivel más bajo. A menudo utilizamos atributos como @classmethod, @staticmethd, @property e incluso __slots__ a través de descriptores. Es una de las herramientas clave para muchas bibliotecas y marcos de alto nivel, y una parte importante de marcos más grandes que utilizan decoradores o metaclases. Nota: Conceptos como decoradores y metaclases se explicarán en artículos futuros.
Aquí hay un ejemplo de un descriptor y el código que hace referencia a la clase de descriptor:
Descriptores de clase:
def __init__(self, key, value_type):
self.key = clave
self.value_ type = value_type
def __get__(self, instancia, propietario):
imprimir ( "Ejecutando get de Descriptores")
return instancia.__dict__[self.key]
def __set__(self, instancia, valor):
print( "Ejecutando el conjunto de descriptores")
si no es instancia(valor, self.value_type):
rise TypeError("El argumento %s debe ser %s"%(self.key, self .value_type))
instancia.__dict__[self.key] = valor
def __delete__(self, instancia):
print("Ejecutando eliminación de descriptores")< / p>
instancia.__dict__.pop(self.key)
clase Persona:
nombre = Descriptores("nombre", str)
edad = Descriptores("edad", int)
def __init__(self, nombre, edad):
self.name = nombre
self.age = edad
persona = Persona("xiaoming ", 15)
print(persona.__dict__)
persona.nombre
persona. name = "jone"
print(person.__dict__) donde la clase Descriptores es un descriptor. Persona es una clase que utiliza descriptores.
El atributo __dict__ de una clase es un atributo integrado de la clase. Las funciones estáticas, funciones de clase, funciones ordinarias, variables globales y algunos atributos integrados de la clase se colocan en el __dict__ de. la clase.
Al exportar una variable de descriptor, se llamará al método __get__ en el descriptor; al configurar una variable de descriptor, se llamará al método __set__ en el descriptor.
Los resultados de ejecutar el ejemplo anterior son los siguientes: