2010-04-28 72 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