2010-04-28 86 views
4

這是我的代碼:如何使用@在Python ..和@property和@classmethod

def a(): 
    print 'sss' 

@a() 
def b(): 
    print 'aaa' 

b() 

和回溯是:

sss 
Traceback (most recent call last): 
    File "D:\zjm_code\a.py", line 8, in <module> 
    @a() 
TypeError: 'NoneType' object is not callable 

所以如何使用「@ 「

感謝

更新

class a: 
    @property 
    def b(x): 
     print 'sss' 

aa=a() 
print aa.b 

它打印:

sss 
None 

如何使用@property

感謝

updated2

和類方法:

class a: 
    @classmethod 
    def b(x): 
     print 'sss' 

aa=a() 
print aa.b 

在它打印:

<bound method classobj.b of <class __main__.a at 0x00B2DC00>> 

回答

9

裝飾器需要是一個可調用對象(無論是一個函數或對象實施__call__),其中,參數是已經裝飾功能,其結果是函數,將替換已裝修的功能,因此,使用您的打印「SSS」的例子不是打印「AAA」的:

 
>>> def a(f): 
...  def replacementfunc(): 
...   print 'sss' 
...  return replacementfunc; 
... 
>>> @a 
... def b(): 
...  print 'aaa' 
... 
>>> b() 
sss 

或者,更復雜的例子:

 
>>> class print_decorator(object): 
...  def __init__(self,text): 
...  self.text = text; 
...  def __call__(self,f): 
...  def replacement(): 
...   print self.text; 
...  return replacement; 
... 
>>> @print_decorator("Hello world!") 
... def b(): 
...  print 'aaa'; 
... 
>>> b() 
Hello world! 

編輯
至於你的問題更新,你需要看看文檔@property。目前尚不清楚你要完成什麼,但我的猜測是,你想:

 
class a: 
    @property 
    def b(self): 
     return 'sss' 

aa=a() 
print aa.b # prints 'sss', whereas without @property, prints <function ... > 
+0

我在這種情況下可能是錯誤的..但這是我認爲的...裝飾者不應該完全取代功能..它應該裝飾它..我。說*** *** aaa ***(***在前面和後面打印使用裝飾) – SysAdmin 2010-04-28 02:10:57

+0

嗨邁克爾,看看更新 – zjm1126 2010-04-28 02:26:05

+1

@SysAdmin,裝飾可以做到這一點,通過返回一個函數,調用函數已通過;但是,實際的語義是返回的函數接管函數的名稱。使用@x def f():....與def f():...相同,後跟f = x(f); – 2010-04-28 02:31:50

4

@a()的意思是「a是一個可調用的,返回一些其他的可贖回,可與功能調用其只有參數,並會返回一個可調用的「。如果您對callable這個術語不熟悉,那麼它只是function的泛化:它可以是一個函數,一個類或具有__call__方法的類的實例。

您的def a正在返回None,所以您明顯違反了您要求的與「@a()」語法相關的「裝飾合同」。

如果你只是使用@a,沒有(),然後a必須接受功能作爲它的參數和返回調用。

我不知道你想實現什麼,但如果它只是「在一個功能的裝飾打印的東西,那麼這會工作:

def a(): 
    print 'sss' 
    return lambda f: f 

現在您可以使用@a()從此這個版本確實尊重我在第一段中解釋過的「裝飾合同」。

+0

嗨亞歷克斯,看看更新 – zjm1126 2010-04-28 02:25:49

+1

@zjm,要明智:每個問題一個問題!無論如何,這個屬性返回的是'def b()'返回的結果,這就是'None',因爲你剛剛落到了尾部,而且_of course_打印classmethod(沒有調用)顯示它是綁定到類的方法,* *還有什麼可能顯示?! – 2010-04-28 03:26:33