¿Existe una clase de descriptor predefinida en Python?
Quiero crear una clase que tenga muchas propiedades, que en su mayor parte serán simplemente get y set. Aquí hay un ejemplo MyClass()
class MyClass():
def getx(self): return self.__x
def setx(self, value): self.__x = value
def delx(self): del self.__x
x = property(getx, setx, delx, "Soy la propiedad 'x'.")
y = property(getx, setx, delx, "Soy la propiedad 'y'.")
bar = MyClass()
bar.x = 'jeff'
bar.y = 3
print(bar.x)
print(bar.y)
Aquí las propiedades x e y son iguales, así que si quiero que x e y sean únicas, necesitaré un nuevo getx / setx / delx para cada una.
Este ejemplo funciona mejor.
class MyClassBase():
def __init__(self, initval=None):
self.val = initval
def __get__(self, obj, objtype):
return self.val
def __set__(self, obj, val):
self.val = val
class MyClassFinal():
x = MyClassBase(1)
y = MyClassBase('xyzzy')
foo = MyClassFinal()
foo.x = 2
print(foo.x)
print(foo.y)
Creo que MyClassBase() es lo que llaman (o es el equivalente de) una clase de descriptor. Ahora las propiedades x, y (y cualquier otra que elija agregar a MyClassFinal()) son independientes.
Parece extraño que tenga que crear MyClassBase() por mi cuenta. ¿No se define esto (o algo equivalente) en algún lugar para que no tenga que crearlo por mi cuenta?
También estoy abierto a un ejemplo diferente de cómo crear una clase con muchas propiedades y un mínimo de código.
davy.ai
Sí, MyClassBase es un ejemplo de una clase Descriptor en Python. Los Descriptores son una característica poderosa de Python que permite definir clases que tienen atributos cuyos valores son controlados por métodos definidos por el usuario. El caso de uso más común de los descriptores es crear objetos “property”, como en el ejemplo anterior.
Existen varios Descriptores integrados en Python, como property, classmethod, staticmethod y abstractmethod. Sin embargo, si necesita un comportamiento más específico para su clase, puede que necesite crear el suyo propio.
En cuanto a la creación de una clase con muchas propiedades, el uso de clases de Descriptor como MyClassBase es una solución elegante que le permite definir propiedades con un mínimo de código. Otra opción a considerar es el uso del decorador @property, que proporciona una forma concisa de definir simples getters y setters para una propiedad. Aquí hay un ejemplo:
En este ejemplo, definimos dos propiedades (x e y) usando el decorador @property. Los métodos getter devuelven las variables internas (_x y _y), y los métodos setter actualizan esas variables con el nuevo valor que se les pasa.
El uso del decorador @property es una forma útil de definir propiedades que tienen getters y setters simples. Sin embargo, para comportamientos más complejos, puede necesitar crear su propia clase de Descriptor, como MyClassBase.
En general, Python proporciona varias formas de definir propiedades en sus clases, dependiendo de sus necesidades y preferencias. La elección correcta resultará en un código más conciso y mantenible.