2010-03-04 15 views
7

Był to piękny sposób na porządkowanie właściwości klasy w ramach jednej funkcji, za pomocą zastosowania dekorator.Wycofanie zastosowania dekoratora

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()) 

Ale teraz zastosowanie jest przestarzałe.

Czy istnieje możliwość, aby osiągnąć taką prostotę i czytelność dla nieruchomości, z nowym, przyszedł zamiast „rozszerzona składnia wywołania”?


Moje podejście jest takie same jak Anurag, ale, nie mam teraz czarownica z nich jest lepszy, proszę spojrzeć:

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() 

Odpowiedz

12

Czy istnieje możliwość, aby osiągnąć taką prostotę i czytelność dla własności

Nowy Python 2.6 sposobem jest:

@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

Nie wiedziałem tego i bardzo mi się to podoba. Magia "stosuj" powyżej była tak nieczytelna, że ​​nie bardzo wiedziałem, o co chodzi. Wiedziałem @property i używać go dużo, ale .setter i .deleter są dla mnie nowe i wygląd (kod samodokumentujące) wielki :) –

+0

Brakuje siebie w argumentach do getter, nie? –

+0

@David: poprawny, poprawiony, ta. – bobince

0

zawsze można napisać własny:

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

jednak nie jestem pewien, widzę korzyści z korzystania apply jako dekorator w ten sposób. Jaki jest przypadek użycia?

+1

I chcesz umieścić deklaracje metod fget/fset w zakresie jednej funkcji. Czy istnieje inne rozwiązanie, z wyjątkiem stosowania dekoratora? –

2

:) że jest sprytny użytkownik stosuje się, choć nie jestem pewien, czy są jakieś pułapki?

mimo to można zrobić to

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()