es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    class MyClass:
        def __init__(self):
            self._x = None
            self._y = None
    
        @property
        def x(self):
            return self._x
    
        @x.setter
        def x(self, value):
            self._x = value
    
        @property
        def y(self):
            return self._y
    
        @y.setter
        def y(self, value):
            self._y = value
    

    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.

Comments are closed.