网易首页 > 网易号 > 正文 申请入驻

Python:数据描述符与非数据描述符

0
分享至

在 Python 的对象模型中,描述符(descriptor)并不是一种对象类型,也不是独立存在的实体,而是对象在属性解析机制中可能承担的一种运行期语义角色。

只有实现了描述符协议、并被绑定在类属性位置上的对象,才会在运行期扮演描述符语义角色。

在这一语义框架下,所谓“数据描述符”与“非数据描述符”,也不是对象的分类,而是描述符协议在属性解析机制中的两种优先级形态。

一、描述符协议与描述符语义

描述符协议由以下方法构成,对象只需实现其中一个或多个,即可能参与属性解析过程。

__delete__(self, instance)          # 参与属性删除解析

当类命名空间中的某个属性对象实现了其中一个或多个方法时,并被绑定在类属性位置上,描述符协议就会在属性解析过程中介入。

根据实现方法的不同,描述符语义角色可分为两类:

1、数据描述符(Data Descriptor)

实现了 __set__() 或 __delete__()(通常也实现 __get__())。

2、非数据描述符(Non-Data Descriptor)

只实现了 __get__(),未实现 __set__() 与 __delete__()。

这一划分并非概念标签,而是直接决定了属性解析时的优先级规则。

二、数据描述符

数据描述符语义的核心特征是:

• 在属性解析顺序中优先于实例 __dict__

• 实例无法通过同名属性绕过其控制

因此,数据描述符表达了强约束属性的语义。

示例:属性验证

p.price = -5            # ValueError

在上述示例中,在脱离属性解析上下文时,Positive() 与任何普通实例对象并无区别。由于它实现了 __get__ 与 __set__ 且被绑定在 Product.__dict__['price'] 上,因此在属性访问解析中承担数据描述符语义。

即使实例 p.__dict__ 中存在同名键,属性解析仍会优先遵循数据描述符语义,因此无法绕过该描述符的控制。

这不是“特殊规则”,而是属性设置与访问机制对描述符协议的明确约定。

三、非数据描述符

非数据描述符语义的核心特征是:

• 在属性解析顺序中低于实例 __dict__

• 可被实例同名属性遮蔽

非数据描述符的语义更像是一种默认访问行为,可被实例属性覆盖的兜底逻辑。

示例:可被实例遮蔽的读取逻辑

print(d.attr)           # 实例属性

这里并不是描述符“失效”,而是属性解析顺序中,实例 __dict__ 的优先级高于非数据描述符语义。

四、属性解析顺序与优先级(机制视角)

在不重写 __getattribute__ 的前提下,obj.attr 的简化解析顺序可以概括为:

1、类命名空间中的数据描述符语义

2、实例 obj.__dict__

3、类命名空间中的非数据描述符语义

4、类命名空间中的普通属性

5、若仍失败,进入 __getattr__ 补救路径

需要再次强调,这里区分的不是“对象类型”,而是对象在属性解析机制中所承担的语义角色。

五、典型应用场景

1、数据描述符

• property(受控读取与写入)

• ORM 字段(Django / SQLAlchemy)

• 属性校验、计算属性、只读属性

示例:property

property 并不是“魔法属性”,而是一个在属性位置上承担数据描述符语义的对象。

2、非数据描述符

• 函数对象(方法绑定)

• staticmethod

• classmethod

示例:staticmethod

print(u.add)            # 被覆盖了

这里体现的并不是 staticmethod 的接口约束能力,而是非数据描述符语义在属性解析顺序中的既定位置。

六、补充说明与边界澄清

1、描述符不是安全机制

描述符并不阻止绕过约束:

obj.__dict__["_value"] = -999

这种行为始终是可能的。

描述符的目标是语言级一致性与约束表达,而非防御性安全。

2、描述符逻辑的复用方式

描述符语义通常通过普通类来实现,并在不同宿主类中分别创建对象实例,绑定到属性位置,从而复用同一套属性管理逻辑。这是框架设计中的核心能力之一。

3、调试与理解建议

当属性行为不符合预期时,优先检查:

cls.__dict__

理解“对象 + 位置 + 协议”的组合,通常能迅速定位问题。

小结

数据描述符与非数据描述符并不是对象类型的区分,而是描述符协议在属性解析机制中的两种优先级语义。实现了写入或删除协议的对象,在类属性位置上承担数据描述符语义,从而获得对属性行为的控制权;仅实现读取协议的对象,则承担可被实例遮蔽的非数据描述符语义。

理解二者的差异,是理解 Python 属性机制、方法绑定与框架设计的基础。


点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
玄学:相师解玄机:耳朵形状分五类,只有贴脑耳藏着祖上庇佑的福报

玄学:相师解玄机:耳朵形状分五类,只有贴脑耳藏着祖上庇佑的福报

老红点评社
2026-02-04 16:44:26
这种饮料正在摧毁你的胰岛细胞!很多糖尿病,都和这种饮料有关!

这种饮料正在摧毁你的胰岛细胞!很多糖尿病,都和这种饮料有关!

蜉蝣说
2026-01-29 14:46:50
2月4日俄乌最新:川普的老套路

2月4日俄乌最新:川普的老套路

西楼饮月
2026-02-04 20:05:21
财政压力的下半场:退休人员占比近四成,才是硬账

财政压力的下半场:退休人员占比近四成,才是硬账

超先声
2026-01-09 16:45:39
马未都:香港宁愿要20万菲佣,也不接受内地保姆,原因很简单

马未都:香港宁愿要20万菲佣,也不接受内地保姆,原因很简单

犀利辣椒
2025-12-27 06:42:38
75岁港星分手后被曝已搬离爱巢,独居在货仓屋,位置偏僻四野荒凉

75岁港星分手后被曝已搬离爱巢,独居在货仓屋,位置偏僻四野荒凉

TVB的四小花
2026-02-05 11:55:19
复婚人员能否享受25天婚假? 成都市人社局:不能 网友:差点被我卡到Bug

复婚人员能否享受25天婚假? 成都市人社局:不能 网友:差点被我卡到Bug

闪电新闻
2026-02-04 12:03:06
被美敲诈后,欧洲反手就捅中国一刀!中企或损数十亿,中方硬刚

被美敲诈后,欧洲反手就捅中国一刀!中企或损数十亿,中方硬刚

史智文道
2026-02-05 11:33:14
金门炮战三位中将副司令丧生,其中一位是吉鸿昌侄子,可惜了

金门炮战三位中将副司令丧生,其中一位是吉鸿昌侄子,可惜了

混沌录
2026-01-28 22:49:07
丢人!火箭队被残阵凯尔特人吊打,杜兰特复出低迷,投射差距大

丢人!火箭队被残阵凯尔特人吊打,杜兰特复出低迷,投射差距大

邹维体育
2026-02-05 10:31:10
青年作者著成经典,受毛主席接见并获正部级待遇,不料数月后便被逮捕

青年作者著成经典,受毛主席接见并获正部级待遇,不料数月后便被逮捕

老杉说历史
2026-02-03 00:39:20
普京与中方完成战略对表,不到24小时,特朗普无条件对华发出邀请

普京与中方完成战略对表,不到24小时,特朗普无条件对华发出邀请

王姐懒人家常菜
2026-02-05 11:19:55
CCTV5直播!晚上19:45,王楚钦提前出线,陈熠爆冷?孙颖莎战强敌

CCTV5直播!晚上19:45,王楚钦提前出线,陈熠爆冷?孙颖莎战强敌

体育就你秀
2026-02-05 05:40:03
小网红称给嫣然捐了5000W,被网友嘲讽是吹牛,李亚鹏却出面证实

小网红称给嫣然捐了5000W,被网友嘲讽是吹牛,李亚鹏却出面证实

新游戏大妹子
2026-02-03 13:42:47
网恋女友“离世”,有遗产指定给男友……香港破获新型“杀猪盘”,314人被骗4400万港元,有人还被骗两次

网恋女友“离世”,有遗产指定给男友……香港破获新型“杀猪盘”,314人被骗4400万港元,有人还被骗两次

每日经济新闻
2026-02-04 00:27:08
千万不要小看F-35,虽然打不过歼-20,却是东风快递、红旗导弹的巨大威胁

千万不要小看F-35,虽然打不过歼-20,却是东风快递、红旗导弹的巨大威胁

利刃号
2026-02-02 19:07:20
国际金银价格持续震荡

国际金银价格持续震荡

新华社
2026-02-05 11:53:05
央媒怒批、坑害老百姓!臭名昭著的五大相声演员,各个难以原谅

央媒怒批、坑害老百姓!臭名昭著的五大相声演员,各个难以原谅

青橘罐头
2026-02-05 11:30:52
路都走不稳,全程开原音假唱,还想去鸟巢开演唱会,谁给她的自信

路都走不稳,全程开原音假唱,还想去鸟巢开演唱会,谁给她的自信

动物奇奇怪怪
2026-02-04 07:04:47
岛国成人VA内幕,那些被逼着拍片儿的女孩

岛国成人VA内幕,那些被逼着拍片儿的女孩

年代回忆
2026-02-02 20:24:54
2026-02-05 12:35:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1737文章数 72关注度
往期回顾 全部

科技要闻

微信给马化腾浇了“一盆冷水”

头条要闻

牛弹琴:中国元首和特朗普通话 特朗普就台湾问题表态

头条要闻

牛弹琴:中国元首和特朗普通话 特朗普就台湾问题表态

体育要闻

奇才:我学生……独行侠:成交!

娱乐要闻

谢娜明年开演唱会:带老歌出来见见人

财经要闻

黄金,出现拐点

汽车要闻

一切交给XWD 捷途旅行者C-DM也能轻松刷冰锅

态度原创

数码
艺术
健康
游戏
本地

数码要闻

AMD确认:Steam Machine今年开始发货!

艺术要闻

他热爱绘画,生活中的每一刻都充满激情!

耳石症分类型,症状大不同

PUBG IP 衍生新作《PUBG:BLINDSPOT》开启抢先体验

本地新闻

围观了北京第一届黑色羽绒服大赛,我笑疯了

无障碍浏览 进入关怀版