如何装饰类中的方法?

我试图装饰一个类中的方法,但Python是抛出一个错误。 我的课堂看起来像这样:

from pageutils import formatHeader myPage(object): def __init__(self): self.PageName = '' def createPage(self): pageHeader = self.createHeader() @formatHeader #<----- decorator def createHeader(self): return "Page Header ",self.PageName if __name__=="__main__": page = myPage() page.PageName = 'My Page' page.createPage() #------- pageutils.py -------------------- def formatHeader(fn): def wrapped(): return '<div class="page_header">'+fn()+'</div>' return wrapped 

Python引发以下错误

 self.createHeader()
 TypeError:wrapped()不带参数(给出1)

我在哪里去打瞌睡?

Python自动传递类实例作为参考。 (在所有的类方法中看到的self论证)。

你可以这样做:

 def formatHeader(fn): def wrapped(self=None): return '<div class="page_header">'+fn(self)+'</div>' return wrapped 

你正在省略uncorated函数中存在的self参数(在你的情况下是createHeader)。

 def formatHeader(fn): from functools import wraps @wraps(fn) def wrapper(self): return '<div class="page_header">'+fn(self)+'</div>' return wrapper 

如果你不确定你要装饰的函数的签名,你可以这样做:

 def formatHeader(fn): from functools import wraps @wraps(fn) def wrapper(*args, **kw): return '<div class="page_header">'+fn(*args, **kw)+'</div>' return wrapper