2010-03-09 12 views
32

¿Cuál es la forma preferida de definir propiedades de clase en Python y por qué? ¿Está bien usar ambos en una clase?Forma preferida de definir propiedades en Python: decorador de propiedades o lambda?

@property 
def total(self): 
    return self.field_1 + self.field_2 

o

total = property(lambda self: self.field_1 + self.field_2) 
+1

¿Dónde ha visto esta "propiedad a través de lambda" que le haría pensar que podría ser "preferida"? ¿Viste muchos de estos? ¿Si es así, donde? –

+0

@ S.Lott Algunos libros de pitón, no me acuerdo. Usaré decoradores a partir de ahora. No hay problema. :-) – parxier

Respuesta

21

La forma decorador es probablemente el mejor en el caso que has demostrado, en la que desea convertir el método en una propiedad de sólo lectura. El segundo caso es mejor cuando desea proporcionar un setter/deleter/docstring, así como el getter o si desea agregar una propiedad que tiene un nombre diferente al método del que deriva su valor.

+10

+1: No use lambdas. Por favor. –

+28

S.Lott: ¿por qué no? (No discutiendo, solo curiosidad) – Yarin

+0

@ S.Lott: está bien, pero ¿cuál es su solución a la limitación de lambdas que no permite docstrings? – smci

4

No utilice lambdas para esto. El primero es aceptable para una propiedad de solo lectura, el segundo se usa con métodos reales para casos más complejos.

49

Para las propiedades de sólo lectura que uso el decorador, de lo que suele hacer algo como esto:

class Bla(object): 
    def sneaky(): 
     def fget(self): 
      return self._sneaky 
     def fset(self, value): 
      self._sneaky = value 
     return locals() 
    sneaky = property(**sneaky()) 

actualización:

Las versiones recientes de pitón mejorado el enfoque decorador:

class Bla(object): 
    @property 
    def elegant(self): 
     return self._elegant 

    @elegant.setter 
    def elegant(self, value): 
     self._elegant = value 
+2

Recibo errores cuando uso flake8, pyflakes cuando uso esta notación. Obtuve la redefinición de las advertencias 'elegantes' de la función. – Stephan

+0

Con Pylint, hay un beneficio adicional para usar el decorador. Consulte [Advertencia de pilón 'W0212' con propiedades que acceden a un miembro protegido: cómo evitarlo]] (http://stackoverflow.com/questions/24833362/pylint-warning-w0212-with-properties-accessing-a-protected-member- cómo-para-avoi). Preserva la capacidad de Pylint para verificar el valor/objeto devuelto. – Hibou57

Cuestiones relacionadas