当前位置: 首页 > news >正文

Python 属性描述符(方法是描述符)

方法是描述符

在类中定义的函数属于绑定方法(bound method),因为用户定义的函
数都有 __get__ 方法,所以依附到类上时,就相当于描述符。示例 20-
13 演示了从示例 20-8 里定义的 Managed 类中读取 spam 方法。

示例 20-13 方法是非覆盖型描述符

>>> obj = Managed()
>>> obj.spam ➊
<bound method Managed.spam of <descriptorkinds.Managed object at 0x74c80c>>
>>> Managed.spam ➋
<function Managed.spam at 0x734734>
>>> obj.spam = 7>>> obj.spam
7

❶ obj.spam 获取的是绑定方法对象。
❷ 但是 Managed.spam 获取的是函数。
❸ 如果为 obj.spam 赋值,会遮盖类属性,导致无法通过 obj 实例访
问 spam 方法。

函数没有实现 __set__ 方法,因此是非覆盖型描述符,如示例 20-13 中
的最后一行所示。

从示例 20-13 中还可以看出一个重要信息:obj.spam 和
Managed.spam 获取的是不同的对象。与描述符一样,通过托管类访问
时,函数的 __get__ 方法会返回自身的引用。但是,通过实例访问
时,函数的 __get__ 方法返回的是绑定方法对象:一种可调用的对
象,里面包装着函数,并把托管实例(例如 obj)绑定给函数的第一个
参数(即 self),这与 functools.partial 函数的行为一致(参见
5.10.2 节)。

为了深入理解这种机制,请看示例 20-14。

示例 20-14 method_is_descriptor.py:Text 类,继承自
UserString 类

import collections
class Text(collections.UserString):def __repr__(self):return 'Text({!r})'.format(self.data)def reverse(self):return self[::-1]

下面来分析 Text.reverse 方法,如示例 20-15 所示。
示例 20-15 测试一个方法

>>> word = Text('forward')
>>> word ➊
Text('forward')
>>> word.reverse() ➋
Text('drawrof')
>>> Text.reverse(Text('backward')) ➌
Text('drawkcab')
>>> type(Text.reverse), type(word.reverse)(<class 'function'>, <class 'method'>)
>>> list(map(Text.reverse, ['repaid', (10, 20, 30), Text('stressed')]))['diaper', (30, 20, 10), Text('desserts')]
>>> Text.reverse.__get__(word)<bound method Text.reverse of Text('forward')>
>>> Text.reverse.__get__(None, Text)<function Text.reverse at 0x101244e18>
>>> word.reverse ➑
<bound method Text.reverse of Text('forward')>
>>> word.reverse.__self__ ➒
Text('forward')
>>> word.reverse.__func__ is Text.reverse ➓
True

❶ Text 实例的 repr 方法返回一个类似 Text 构造方法调用的字符串,
可用于创建相同的实例。
❷ reverse 方法返回反向拼写的单词。
❸ 在类上调用方法相当于调用函数。
❹ 注意类型是不同的,一个是 function,一个是 method。
❺ Text.reverse 相当于函数,甚至可以处理 Text 实例之外的其他对
象。
❻ 函数都是非覆盖型描述符。在函数上调用 __get__ 方法时传入实
例,得到的是绑定到那个实例上的方法。
❼ 调用函数的 __get__ 方法时,如果 instance 参数的值是 None,那
么得到的是函数本身。
❽ word.reverse 表达式其实会调用
Text.reverse.__get__(word),返回对应的绑定方法。
❾ 绑定方法对象有个 __self__ 属性,其值是调用这个方法的实例引
用。
❿ 绑定方法的 __func__ 属性是依附在托管类上那个原始函数的引用。

绑定方法对象还有个 __call__ 方法,用于处理真正的调用过程。这个
方法会调用 __func__ 属性引用的原始函数,把函数的第一个参数设为
绑定方法的 __self__ 属性。这就是形参 self 的隐式绑定方式。
函数会变成绑定方法,这是 Python 语言底层使用描述符的最好例证。
深入了解描述符和方法的运作方式之后,下面讨论用法方面的一些实用
建议。

http://www.dtcms.com/a/320601.html

相关文章:

  • MySQL 配置性能优化赛:核心策略与实战技巧
  • 新客户 | TDengine 时序数据库是怎么在钢厂“撬动”PI 的?
  • [Flutter] v3.24 AAPT:错误:未找到资源 android:attr/lStar。
  • 详解 Seaborn:让数据可视化更简单高效的 Python 库
  • 使用Python爬虫,selenium能否替代requests?
  • centos出现ping: baidu.com: 未知的名称或服务问题
  • 每日五个pyecharts可视化图表:条形图与关系图
  • 【Centos】Redis 单机部署图文步骤
  • Vue3 基本语法
  • 《从零构建大语言模型》学习笔记2,文本数据处理1(以及tiktoken库无法下载gpt2参数,调用get_encoding时SSL超时的解决方法)
  • 【lucene】PostingsEnum.freq()
  • CVRF 是什么?微软弃用 MS 编号后,网络安全的下一个标准
  • C/C++与JavaScript的WebAssembly协作开发指南
  • 电脑定时开关机终极指南
  • 2025小程序怎么快速接入美团核销,实现自动化核销
  • PeiQi网络安全知识文库PeiQi-WIKI-Book保姆式搭建部署教程
  • sqli-labs通关笔记-第38关 GET字符型堆叠注入(单引号闭合 手工注入+脚本注入两种方法)
  • 欧拉角、四元数与旋转矩阵的C语言转换实现
  • 《论文阅读》传统CoT方法和提出的CoT Prompting的区分
  • 手搓MCP全流程指南:从本地开发部署到PyPI公开发布
  • 自由学习记录(79)
  • 深入解析 Seaborn:数据可视化的优雅利器
  • 智慧社区(九)——事务加持下的小区删除操作
  • Azure OpenAI gpt5和AWS Secrets Manager构建智能对话系统
  • 智能云探索:基于Amazon Bedrock与MCP Server的AWS资源AI运维实践
  • AWS 云小白学习指南 (一)
  • 跟着尚硅谷学vue-day7
  • 【华为机试】55. 跳跃游戏
  • LeetCode有效三角形的个数
  • 借助Rclone快速从阿里云OSS迁移到AWS S3