2010-03-04 63 views
7

通過使用應用裝飾器,可以在一個函數的框架中組織類屬性。棄用應用裝飾器

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

但現在申請已被棄用。

有沒有可能實現這樣的屬性的簡單性和可讀性,新的,而不是「擴展調用語法」?


我的做法是一樣的阿努拉格的,但是,我現在不女巫一個是更好的,請看:

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

回答

12

是否有可能實現的特性,例如簡潔性和可讀性

新的Python 2.6的方式是:

@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

我不知道這一點,我非常喜歡它。上面的'應用'魔法是如此難以理解,我不太清楚這個問題是關於什麼的。 我知道@property並使用它很多,但.setter和.deleter對我來說是新的並且看起來很棒(自編檔案代碼:) :) – 2010-03-04 09:18:07

+0

你在getter的參數中缺少自我,不是嗎? – 2011-02-20 03:27:52

+0

@大衛:正確,固定,ta。 – bobince 2011-02-26 09:41:53

0

你總是可以編寫自己:

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

但是,我不太確定我是否看到以這種方式使用apply作爲裝飾器的好處。什麼是用例?

+1

我希望將fget/fset方法的聲明放在一個函數的範圍內。除了應用裝飾器之外,還有其他解決方案嗎? – 2010-03-04 08:06:17

2

:)這是一個聰明的用戶申請,但我不確定是否有任何陷阱?

反正你能做到這一點

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