python - 如何在类中装饰方法?

标签 python decorator

我试图在一个类中装饰一个方法,但是 python 抛出一个错误。我的类(class)是这样的:

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

pageutils.py:

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

Python 抛出以下错误

self.createHeader()
TypeError: wrapped() takes no arguments (1 given)

我在哪里偷懒?

最佳答案

您省略了未修饰函数中存在的 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

关于python - 如何在类中装饰方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1367514/

相关文章:

c# - 具有多个接口(interface)的 Autofac Open Generic Decorator 导致循环依赖解析

python - 如何将所有参数传递给装饰器?

python - 为什么C中的运行时是如此随机?

python - ZODB 无法提交

javascript - 使用 Python 和 MongoDB 进行实时分析

python - 我如何在 Django 中编写装饰器来检查两个单独的条件并相应地重定向?

php - Zend Framework 2 - 表单元素装饰器

python - 属性错误 : 'numpy.ndarray' object has no attribute 'save'

Python pylab 绘图传奇科学写作

显示传递和默认 kwargs 的 python 装饰器