我试图在类中装饰一个方法,但python正在抛出一个错误.我的班级看起来像这样:
from pageutils import formatHeader
class 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()
Run Code Online (Sandbox Code Playgroud)
pageutils.py:
def formatHeader(fn):
def wrapped():
return '<div class="page_header">'+fn()+'</div>'
return wrapped
Run Code Online (Sandbox Code Playgroud)
Python抛出以下错误
self.createHeader()
TypeError: wrapped() takes no arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
我在哪里玩耍?
kra*_*oti 60
您省略了未修饰函数中存在的self参数(在您的情况下为createHeader).
def formatHeader(fn):
from functools import wraps
@wraps(fn)
def wrapper(self):
return '<div class="page_header">'+fn(self)+'</div>'
return wrapper
Run Code Online (Sandbox Code Playgroud)
如果您不确定要装饰的功能的签名,可以使其如下所示:
def formatHeader(fn):
from functools import wraps
@wraps(fn)
def wrapper(*args, **kw):
return '<div class="page_header">'+fn(*args, **kw)+'</div>'
return wrapper
Run Code Online (Sandbox Code Playgroud)
exh*_*uma 35
Python自动将类实例作为引用传递.(self在所有类方法中都可以看到的参数).
你可以这样做:
def formatHeader(fn):
def wrapped(self=None):
return '<div class="page_header">'+fn(self)+'</div>'
return wrapped
Run Code Online (Sandbox Code Playgroud)