这个Python装饰器是如何工作的?

2024-01-13

我正在研究 Python 中的一些延迟加载属性装饰器,并且发生在这个示例中(http://code.activestate.com/recipes/363602-lazy-property-evaluation/ http://code.activestate.com/recipes/363602-lazy-property-evaluation/):

class Lazy(object):
    def __init__(self, calculate_function):
        self._calculate = calculate_function

    def __get__(self, obj, _=None):
        if obj is None:
            return self
        value = self._calculate(obj)
        setattr(obj, self._calculate.func_name, value)
        return value

# Sample use:

class SomeClass(object):

    @Lazy
    def someprop(self):
        print 'Actually calculating value'
        return 13

o = SomeClass()
o.someprop
o.someprop

我的问题是,这是如何运作的?我对装饰器的理解是它们必须是可调用的(因此实现的函数或调用__call__), but Lazy这里显然不是,如果我尝试Lazy(someFunc)()它会按预期引发异常。我缺少什么?


当一个属性名为someprop在实例上访问o班级的SomeClass, if SomeClass包含一个描述符 named o,那么该描述符的类的__get__使用方法。有关描述符的更多信息,请参见本指南 http://users.rcn.com/python/download/Descriptor.htm。不要让这样的事实Lazy从语法上讲,这里用作装饰器,让您看不到它的实例是描述符的事实,因为Lazy本身有一个__get__ method.

装饰器语法

    @Lazy
    def someprop(self):
       ...

只不过是以下语法糖:

    def someprop(self):
       ...
    someprop = Lazy(someprop)

的限制Lazy当它与装饰器语法一起使用或直接使用时没有什么不同:它必须接受someprop(一个函数)作为其参数——对其返回的内容没有任何限制。这里,Lazy是一个类,因此它返回自身的实例,并且有一个__get__特殊方法,以便实例是一个描述符(因此当someprop在实例上访问属性o班级的SomeClass)——这就是全部内容,不多也不少。

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

这个Python装饰器是如何工作的? 的相关文章

随机推荐

  • 如何使用 com.android.camera.action.CROP 设置输出图像

    我有裁剪图像的代码 如下所示 public void doCrop Intent intent new Intent com android camera action CROP intent setType image List
  • 如何为python3.4.2安装pysqlite

    i use kali linux and i need sqlite3 driver for python3 4 2 i tried the pysqlite install but get an erorr pls help me how
  • JS SDK 与 PHP SDK

    从我对各个网站的简要探索来看 JS SDK 似乎比 PHP SDK 更常用 即使是用 PHP 实现的网站也使用 JS SDK PHP 参考页面有 776 个赞 而 JS 参考页面有 20k 个赞 PHP 参考页面说 PHP SDK 可以帮助
  • 任何 redis 调用的 ioredis send 命令的默认超时是多少

    我将 ioredis 与节点应用程序一起使用 由于集群中的一些问题 我开始得到 集群重定向过多 最后一个错误 错误 连接已关闭 由于这个原因 我的所有 redis 调用都失败了 并且经过了很长一段时间 从 1 秒到 130 秒 ioredi
  • “精化”的反义词是什么

    在世界上通用编程的概念细化很常见 特别是给定一个概念C1 那么我们说一个概念C2提炼C1如果它提供了所有功能C1甚至可能更多 怎么称呼逆关系呢 因此 如果C2是一个细化C1 then C1是一个什么C2 语言学中有两个术语定义了本主题中讨论
  • 如何在 BigQuery UDF 主体内声明变量?

    我试图在 BigQuery 上创建一个带有 while 循环的 UDF 函数 但我在文档中没有看到任何专门解决这种情况的语法指南 也没有解决 UDF 正文中变量的声明 上下文 我正在尝试构建一个函数来将标题大小写应用于字符串 I tried
  • 将 dplyr tbl 列提取为向量

    是否有一种更简洁的方法可以从具有数据库后端的 tbl 中获取 dplyr tbl 的一列作为向量 即数据框 表不能直接成为子集 require dplyr db lt src sqlite tempfile create TRUE iris
  • 如何在Python中删除重复的短语?

    假设我有一个字符串 例如 I hate some kinds of duplicate This string has a duplicate phrase duplicate phrase 我想删除第二次出现的duplicate phra
  • 更改日历项目的前景色

    我正在 WPF 中自定义日历控件 并且可以调整背景颜色 标题前景色等 但我找不到如何编辑 1 31 天日历项目的外观 在 截屏 正如您所看到的 这些数字都是深灰色的 几乎不可读 我还想去掉鼠标悬停时的蓝色覆盖层 Code
  • 图层列表忽略标签

    我想创建一个自定义单选按钮 我使用与
  • 如何通过Windows命令行关闭TCP和UDP端口

    有人知道如何通过 Windows 命令行关闭单个连接的 TCP 或 UDP 套接字吗 谷歌了一下 我看到有人问同样的问题 但答案看起来像是 netstat 或 netsh 命令的手册页 重点关注如何监视端口 我不需要有关如何监控它们的答案
  • 如何将 Postgres 中两个数组的值插入表中?

    假设 我有一张桌子 create table mytable x text y text 我有一些数组 其值为x并为y called arr x and arr y x1 x2 x3 y1 y2 y3 我想通过一个查询插入这些值 期望的结果
  • 版本控制为了版本控制?

    我在公司的上一个版本中负责监督分支和合并 并且多次必须修改我们的 Subversion 预提交挂钩 以强制执行对签入注释等的不同要求 每次编辑这些文件时我都有点紧张 因为 a 它们是现场制作系统的一部分 尽管仅在内部使用 而且我们不是一个庞
  • 用于带有数据的 Union 类型的 Elm JSON 解码器

    我的 json 看起来像这样 name providerWithVal value example 或者像这样 name provider2 or name provider3 我的 Elm 联合类型定义如下 type Provider P
  • 为什么Sun 不做C# 到Java 字节码编译器?

    我们想要在 JVM 上运行 C 代码 我的公司拥有庞大的 C 代码库 超过一半的代码是我们用于创建 读取 修改 计算和编写 Excel 工作簿的核心引擎 我们经常收到客户和潜在客户的问题 询问我们是否要构建引擎的 Java 版本 他们中的许
  • 将iso8601字符串日期时间格式转换为Java中的日期[重复]

    这个问题在这里已经有答案了 All 我知道我之前曾问过类似的问题 关于使用 Java 将 ISO8601 日期字符串解析为日期 但这是使用 SimpleDateFormat 类的更具体的问题 我读过这篇文章维基 ISO8601 日期 htt
  • Qt OpenGL-如何根据鼠标点击获取对象

    我正在尝试在 Qt openGL 中制作应用程序 在这里 我必须根据鼠标单击来了解单击的对象 我的想法是存储点 QWidget 中的对象区域 并将鼠标单击与这些点相匹配 有人能说出如何做到这一点吗 或者任何人都可以展示其他方式吗 这个问题通
  • 单击 Jbutton 后如何显示/隐藏附加到 Jlabel 的图像?

    我是编程世界的新手 我需要一些帮助 我会尽量说得清楚 这是我目前的情况 我正在编写一个简单的游戏 在 Jframe 上 我添加了一个 Jlabel 在其上附加了图像 我还在 Jframe 上添加了一个 Jbutton 我希望当我单击 Jbu
  • 插座对比世界碳纤维

    我开发一个类似聊天的应用程序 在客户端使用 Silverlight 在服务器端使用 wpf 现在通信基于套接字 我有不同的消息类 我将它们序列化并通过 TCP 发送 我开始意识到为每个可能的通信场景创建单独的消息类是相当大的开销 并考虑迁移
  • 这个Python装饰器是如何工作的?

    我正在研究 Python 中的一些延迟加载属性装饰器 并且发生在这个示例中 http code activestate com recipes 363602 lazy property evaluation http code active