define - python property decorator
Python: ¿Cómo pasar más de un argumento al getter de la propiedad? (5)
Considere el siguiente ejemplo:
class A:
@property
def x(self): return 5
Entonces, por supuesto, llamar a = A(); ax
a = A(); ax
volverá 5
Pero imagina que quieres poder modificar la propiedad x.
De esta manera, por ejemplo:
class A:
@property
def x(self, neg = False): return 5 if not neg else -5
Y llámalo con a = A(); ax(neg=True)
a = A(); ax(neg=True)
Eso generará un error TypeError: ''int'' object is not callable
, eso es bastante normal, ya que nuestra x
se evalúa como 5
.
Entonces, me gustaría saber cómo se puede pasar más de un argumento al comprador de la propiedad, si es posible.
Creo que no entendiste completamente el propósito de las propiedades.
Si crea una propiedad x
, tendrá acceso a ella usando obj.x
lugar de obj.x()
. Después de crear la propiedad, no es posible llamar directamente a la función subyacente.
Si desea pasar argumentos, get_x
nombre a su método get_x
y no lo convierta en una propiedad:
def get_x(self, neg=False):
return 5 if not neg else -5
Si quieres crear un setter, hazlo así:
class A:
@property
def x(self): return 5
@x.setter
def x(self, value): self._x = value
En su segundo ejemplo, está usando ax()
como si fuera una función: ax(neg=True)
. Con esto en mente, ¿por qué no simplemente definirlo como una función?
Sé que esta pregunta es antigua, pero, como referencia, puede llamar a su propiedad con un argumento como ese:
a = A()
assert a.x == 5
assert A.x.fget(a, True) == -5
Como otros mencionados por otros, esto no es aconsejable.
Tenga en cuenta que no tiene que usar la property
como decorador. Puede felizmente usarlo de la manera antigua y exponer los métodos individuales además de la propiedad:
class A:
def get_x(self, neg=False):
return -5 if neg else 5
x = property(get_x)
>>> a = A()
>>> a.x
5
>>> a.get_x()
5
>>> a.get_x(True)
-5
Esto puede o no ser una buena idea, dependiendo de exactamente lo que está haciendo con él (pero espero ver una justificación excelente en un comentario si encuentro este patrón en cualquier código que esté revisando)
una propiedad solo debe depender del objeto relacionado. Si desea usar algunos parámetros externos, debe usar métodos.