如何装饰可调用类的实例?

2024-04-14

def decorator(fn):
    def wrapper(*args, **kwargs):
        print 'With sour cream and chives!',
        return fn(*args, **kwargs)
    return wrapper

class Potato(object):
    def __call__(self):
        print 'Potato @ {} called'.format(id(self))

spud = Potato()
fancy_spud = decorator(Potato())

通过这段代码,我们有两个可调用类的实例,一个是修饰的,一个是普通的:

>>> spud()
Potato @ 140408136280592 called
>>> fancy_spud()
With sour cream and chives! Potato @ 140408134310864 called

我想知道是否以某种方式支持使用@decorator仅针对一个实例的可调用语法 - 与装饰类/方法相反,后者适用于每个实例。根据this https://stackoverflow.com/a/1594484/674039流行的答案是,@syntax 只是糖:

function = decorator(function)

但这是否过于简单化了?在我所有不成熟的尝试中,它似乎只有在语法出现之前才有效def, class、空格或@another_decorator.

@decorator
baked = Potato()

那是一个SyntaxError.

baked = Potato()
@decorator
baked

Also SyntaxError.

@decorator
def baked(_spud=Potato()):
    return _spud()

有效,但很丑而且有点作弊。


是的,这过于简单化了。如果我们看一下语法 https://docs.python.org/3/reference/grammar.html, decorator只出现在规则中decorators,它仅作为一部分出现classdef or funcdef:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
decorated: decorators (classdef | funcdef)

什么是语言参考说 https://docs.python.org/3/reference/compound_stmts.html#function-definitions(我认为这是链接答案中重复的内容)是

@f1(arg)
@f2
def func(): pass

相当于

def func(): pass
func = f1(arg)(f2(func))

类定义也类似。但这并不意味着@decorator语法可以应用于任何地方;它仅在函数或类定义之前有效。

顺便说一句,即使是官方文档也不完全正确;在调用装饰器时,函数(或类)并未绑定到封闭的命名空间或范围中,因此给定的语法并不完全等效。

有一些有趣的事情def and class声明,我认为这是它们是唯一支持的声明的部分原因@decorator语法:它们是 Python 中将名称绑定到对象的唯一方法知道那个名字是什么.

最后,这是调用您可能喜欢的装饰器的另一种方法:

@decorator
class baked:
    __metaclass__ = lambda *_: Potato()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何装饰可调用类的实例? 的相关文章

随机推荐

  • 如何在 PostgreSQL 8.4 中从 string_to_array() 返回一个元素?

    我想解析具有以下类型值的字段 DAVE EBERT CONSTRUCTION 139 LENNOX STREET SANTA CRUZ CA 95060 公司电话号码 831 818 3170 我想做一个这样的查询 Update mytab
  • tkinter 错误的屏幕距离“10 0”

    My goal is to pady this section marked with a red circle slighty down Snippet of my code supposed to pady the last label
  • C# 和 C++ 中 ++i 运算符的区别

    我用 C 和 C 编写了以下代码 int i 0 i 11 此 C 编译器出现错误后 The left hand side of an assignment must be a variable property or indexer 但是
  • 如何禁用 Identityserver4 的 SSL

    为了测试目的 我需要在 DotNet Core 2 中禁用 IdentityServer4 的 SSL TSL 我看过这个链接 禁用 Identityserver3 的 SSL https stackoverflow com questio
  • ActiveRecord 迁移未填充 Postgres 物化视图

    我有一个MATERIALIZED VIEW这是通过迁移创建的 class MyView lt ActiveRecord Migration def up ActiveRecord Base connection execute lt lt
  • 如何在 mongoose js 中嵌套相同的模式

    我正在尝试使用 mongoose js 嵌套模式 特别是sameschema 创建树状结构 在此配置中 一个文档只能有 1 个父文档 但同一文档可以是多个子文档的父文档 以下是我最初的处理方式 var mongoose require mo
  • 读写模式Python [重复]

    这个问题在这里已经有答案了 可能的重复 python open内置函数 模式a a w w 和r 之间的区别 https stackoverflow com questions 1466000 python open built in fu
  • CSS 图像遮罩叠加

    我正在尝试获取一个透明的 png 框架图像 将其悬停在 img 标签上 以在其上创建框架的外观 我尝试了多种不同的方法 但似乎都不起作用 我使用的最新方法是http www cssbakery com 2009 06 background
  • 如何在 Struts 2 验证框架中验证布尔值

    简单 我必须确保选中表单上的隐私复选框 我尝试使用表达式验证器 和字段表达式验证器 但它不起作用 有谁能够帮助我 您能提供更多信息吗 您是如何使用表达式验证器的 为什么它不起作用 看来这种方法应该很好用 需要考虑一些事情 您的布尔值是否同时
  • 硒,是否存在多种元素之一?

    以答案为基础如何使用 Selenium for Python 等待页面加载 https stackoverflow com questions 26566799 how to wait until the page is loaded wi
  • 如何获取 Mac(Cocoa 或 C)的电池电量(以 mWh(而非百分比)为单位)

    标题几乎解释了一切 我正在创建一个 Mac 应用程序 我需要电池电量具体单位为毫瓦时 不是百分比 最好用 C 或 Objective C 来做 Thanks 抱歉 但我认为硬件没有办法报告这一点 随着电池进入其生命周期 它会随着时间的推移而
  • 以 json 形式返回时排除某些字段

    我有一个 ASP NET Web API 应用程序 现在假设应用程序由 User 实体和 Post 实体组成 帖子是由用户编写的 因此每个帖子实体都包含对用户实体的引用 class Post public int Id get set pu
  • android 列表视图按钮

    我正在尝试在列表视图中添加一个按钮 但按钮没有显示 我正在使用 json 解析从我的服务器获取数据 我正在使用哈希图和列表视图 此外 我也无法在列表视图中添加按钮 这是我的代码 package acb xiynove import java
  • 使用 Open Graph API 阻止用户

    是否可以使用开放图谱 API 阻止 Facebook 上的用户 我不想阻止用户使用应用程序 但希望允许用户在我的应用程序中阻止 Facebook 好友 如果他们愿意 这与访问 Facebook com 并阻止用户一样 从而将他们隐藏在您的所
  • ADO 参数化查询不返回任何结果

    我正在使用此查询从经典 asp 页面中的 vbscript 获取一些结果 但它不会返回任何值 该页面是空白的 也没有错误 请问有什么建议吗 dim cmd admin no admin no request QueryString admi
  • Sammy.js 使用 &,? 读取路由

    需要的路线看起来像 routeName param1 aaaa param2 bbb 添加到萨米 routeName param1 param2 and routeName param1 param2 他们都不起作用 我自己一直在 Samm
  • AVAssetExportSession - 在 IOS 中加入 2 个 mp4 文件

    我正在尝试使用以下代码在 ipad 2 上将 2 个预先存在的 mpeg 4 视频连接在一起 void mergeTestVideos setup asset NSString firstassetpath NSString stringW
  • Spring Tool Suite 找到 spring-boot 集成测试配置并且不启动主应用程序

    我在使用 Spring Tool Suite 与 spring boot 时遇到了一些困难 我创建了一个自定义 Maven spring boot web application 其中包括多个 JUnit 测试 其中一个测试是集成测试 它具
  • 建模单个子表/多个父表

    我正在努力对共享单个表 子表 的多个表 父表 之间的关系进行建模 给定以下父表1 其他父表2 3等类似 Entity Table name parent1 public class ParentEntity1 Id Column name
  • 如何装饰可调用类的实例?

    def decorator fn def wrapper args kwargs print With sour cream and chives return fn args kwargs return wrapper class Pot