首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类装饰器与函数装饰器

类装饰器与函数装饰器
EN

Stack Overflow用户
提问于 2011-07-13 08:19:59
回答 5查看 6.9K关注 0票数 29

在python中,有两种方法来声明装饰者:

基于类的

代码语言:javascript
复制
class mydecorator(object):
    def __init__(self, f):
        self.f = f

    def __call__(self, *k, **kw):
        # before f actions
        self.f(*k, **kw)
        # after f actions

基于函数的

代码语言:javascript
复制
def mydecorator(f):
    def decorator(*k, **kw):
        # before f actions
        f(*k, **kw)
        # after f actions

    return decorator          

这些声明之间有什么区别吗?在哪种情况下,每一种都应该使用?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-13 08:57:13

如果要将状态保持在装饰符中,则应该使用类。

例如,这不起作用。

代码语言:javascript
复制
def mydecorator(f):
    x = 0 
    def decorator():
        x += 1 # x is a nonlocal name and cant be modified
        return f(x)
    return decorator 

有很多解决方法,但最简单的方法是使用类。

代码语言:javascript
复制
class mydecorator(object):
    def __init__(self, f):
        self.f = f
        self.x = 0

    def __call__(self, *k, **kw):
        self.x += 1
        return f(self.x)
票数 20
EN

Stack Overflow用户

发布于 2011-07-13 10:31:49

当您创建一个可调用的返回另一个可调用的函数时,函数方法更容易、更便宜。有两个主要区别:

  1. 函数方法与方法一起自动工作,而如果使用类方法,则必须读取描述符并定义__get__方法。
  2. 类方法使保持状态更容易。您可以使用闭包,特别是在Python3中,但是通常倾向于使用类方法来保持状态。

此外,函数方法允许您在修改或存储原始函数之后返回它。

但是,装饰师可以返回可调用的或更多的可调用的东西。有了一门课,你可以:

将方法和属性添加到修饰的可调用对象中,或对其实现(uh-oh).

  • Create描述符的操作,这些描述符在放入类(例如,property)

  • Use继承以实现相似但不同的装饰符)时以特殊方式执行。

如果你有任何疑问,扪心自问:你想让你的装饰师返回一个功能和函数完全一样的函数吗?使用返回函数的函数。您希望您的装饰器返回一个自定义对象,该对象可以执行更多的任务,还是与函数的功能不同?创建一个类并将其用作装饰器。

票数 20
EN

Stack Overflow用户

发布于 2011-07-13 08:46:01

事实上,没有“两种方式”。只有一种方法(定义一个可调用的对象)或python中生成可调用对象的方式一样多(它可以是其他对象的一个方法,一个lambda表达式的结果,一个“部分”对象,任何可调用的东西)。

函数定义是创建可调用对象的最简单方法,而且作为最简单的方法,在大多数情况下可能是最好的。使用类为您提供了更多的可能性,可以清晰地编写更复杂的案例(即使在最简单的情况下,它看起来相当优雅),但它所做的事情并不明显。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6676015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档