2010-03-04 21 views
7

Había una manera hermosa de organizar la propiedad de clase en el marco de una función, mediante el uso del decorador de aplicación.obsolescencia del decorador de aplicación

class Example(object): 
    @apply 
    def myattr(): 
     doc = """This is the doc string.""" 

     def fget(self): 
      return self._half * 2 

     def fset(self, value): 
      self._half = value/2 

     def fdel(self): 
      del self._half 

     return property(**locals()) 

Pero ahora aplicar ha quedado obsoleto.

¿Hay alguna posibilidad de lograr tal simplicidad y legibilidad para la propiedad, con lo nuevo, vino en cambio la "sintaxis de llamada extendida"?


Mi enfoque es el mismo que Anurag de, pero, no ahora la bruja de uno es mejor, por favor mire:

def prop(f): 

    return property(**f()) 

class A(object): 

    @prop 
    def myattr(): 

     def fget(self): 
      return self._myattr 

     def fset(self, value): 
      self._myattr = value 

     return locals() 

Respuesta

12

¿Hay alguna posibilidad de alcanzar tal simplicidad y legibilidad de la propiedad

La nueva forma de Python 2.6 es:

@property 
def myattr(self): 
    """This is the doc string.""" 
    return self._half * 2 

@myattr.setter 
def myattr(self, value): 
    self._half = value/2 

@myattr.deleter 
def myattr(self): 
    del self._half 
+3

No sabía esto y me gusta mucho. La magia de "aplicar" anterior era tan ilegible que no sabía muy bien de qué se trataba la pregunta. Conocí @property y lo uso mucho, pero .setter y .deleter son nuevos para mí y se ven geniales (código de auto-documentación) :) –

+0

Te estás perdiendo de los argumentos al comprador, ¿no? –

+0

@David: correcto, fijo, ta. – bobince

0

Siempre se puede escribir su propia:

def apply(f, a): 
    return f(*a) 

Sin embargo, no estoy muy seguro de ver el beneficio de usar apply como decorador de esta manera. ¿Cuál es el caso de uso?

+1

I desea colocar declaraciones de métodos fget/fset en el alcance de una función. ¿Hay alguna otra solución, excepto aplicar el decorador? –

2

:) que es un usuario inteligente de la aplicación, aunque no estoy seguro de si hay algún inconveniente?

de todas formas se puede hacer esto

class Example(object): 
    def myattr(): 
     doc = """This is the doc string.""" 

     def fget(self): 
      return self._half * 2 

     def fset(self, value): 
      self._half = value/2 

     def fdel(self): 
      del self._half 

     return property(**locals()) 
    myattr = myattr()