[python] ¿Cómo funciona el decorador @property?


Answers

documentation que es solo un atajo para crear propiedades de solo lectura. Asi que

@property
def x(self):
    return self._x

es equivalente a

def getx(self):
    return self._x
x = property(getx)
Question

Me gustaría entender cómo funciona la property función incorporada. Lo que me confunde es que la property también se puede usar como decorador, pero solo toma argumentos cuando se usa como función incorporada y no cuando se usa como decorador.

Este ejemplo es de la documentation :

class C(object):
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

Los argumentos de property son getx , setx , delx y una cadena de documentación.

En el siguiente código, la property se usa como decorador. El objeto de esto es la función x , pero en el código de arriba no hay lugar para una función de objeto en los argumentos.

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

Y, ¿cómo se x.deleter decoradores x.setter y x.deleter ? Estoy confundido.




Una propiedad se puede declarar de dos maneras.

  • Crear los métodos getter, setter para un atributo y luego pasarlos como argumento a la función de propiedad
  • Usando el decorador @property .

Puedes echar un vistazo a algunos ejemplos que he escrito sobre propiedades en Python .




Aquí hay un ejemplo mínimo de cómo se puede implementar @property :

class Thing:
    def __init__(self, my_word):
        self._word = my_word 
    @property
    def word(self):
        return self._word

>>> print( Thing('ok').word )
'ok'

De lo contrario, la word sigue siendo un método en lugar de una propiedad.

class Thing:
    def __init__(self, my_word):
        self._word = my_word
    def word(self):
        return self._word

>>> print( Thing('ok').word() )
'ok'





Related