假装Python高手,你真的懂属性描述符类!

const描述符可修饰全局函数吗?为什么C#有const和readonly两种常量关键字?C++成员函数为什么可以由const和非const版本?const常量的不同形式? C++可以用const修饰成员函数,表示成员函数不会修改任何类成员,这是安全的编码习惯。注意,这仅仅适用于类的成员函数,如果是形如C语言的全局函数,是不可以用const修饰。但,const可以修饰函数参数。 阅读详情

Python学了好几年,发现功力还是那样,很多同学经常这样抱怨!都说Python入门容易,精通难,确实是这样的,每当我们打开一些牛逼的源码框架,进去看窥探大牛的源码,比如Python里面非常著名的Django和Flask里面的源码,发现跟天书一样。

大神都大量的使用了一些元编程,魔法函数,以及类的一些深入特性,做了很多封装。最近菜鸟哥准备写一个系列,假装Python高手系列,欢迎大家来指导工作。


9bd6cb3a0dd3b8f42509c9c3e5e3517f.png

今天我们写一下入门的篇,什么是描述符类!

1.问题的来源

所有的高级技巧其实都是为了让代码更简洁,更好复用,更好扩展,就是为了这个道,而产生出很多法,设计出什么招式来解决。比如我们在实际的项目中会要设计一个Student类,类似这样的:

d3e4bf35a626c13f8c458d88e5dea6f2.png

这个类的接口有两个参数,一个是输入学生的年龄(age),一个是输入学生的成绩(score)。但是细细想,我们录入年龄和成绩的时候,需要判断是否是整数而且会有一定的范围,就是入口参数检测。

于是我们就会把代码复杂到这样:

a32917225bc2d7f8b50d9b45a64e464d.png

我们要检查年龄是否是int and 大于0,要检查score是否为int and 在0-100之间。这样的检查非常啰嗦很冗余,如果我们这个系统有10个类似的这样的参数都这检查,是不是非常麻烦,代码越写越长,全部挤在一起,又重复有不好debug,肿怎么办?

2.如何解决

我先来看一下大师是怎么处理这样的问题的,尤其是写框架的大师,比如django中设计model的时候我们会碰到很多类似的这样的模型参数:

16e11663fabdecd31cebdbdb70bf3d3a.png

这个是我们从django里面随便拿出一段model设计的代码,oam创建模型的时候,我们有age/phone这样的small int的参数,就会有用一个SmalIntergerField类型去进行封装检查。

而这个SmallIntergerField就是描述符的类,就是把一个类作为一个类属性进行封装。我们回到上面的student这个类,进一步的拆解。

我们希望我们的类还是设计的很简单,但是在self.age=age进行赋值的时候,能自动的帮我进行检查,这个时候就是类描述符上场了。

class Student:
   def __init__(self,age,score):
        self.age=age
        self.score=score

3.什么是属性描述符类

就是如果一个类里面带__get__,__set__,__del__魔法函数一个或者多个的类就是描述符类。他会有特殊的用法,比如我们设计一个IntField这样的类:

d2039e72c47350c9b2ca37f253358ade.png

那么这样的描述符类有什么特殊的用处的,其实这就是假装Python高手的精华地方,我们需要把这个描述符类作为一个属性封装到Student类里面。

4.进阶高手,设计属性描述符类

经过前面的讲解,大家知道了问题所在,已经什么是描述符类,这样知识要串起来才有用,那么如何利用把描述符类封装到Student类里面来帮助我们解决上面的痛点呢。其实很简单,看代码:

9d1aa8b7c1fe3317c59347d6f9764a4d.png

我们可以很清楚的看到,我们在Student类里面设计了一个类属性age,它其实是一个描述符的类,当我们在init里面赋值给self.age=age的时候,就会自动触发调用__set__函数,而这个里面就可以帮助我们进行参数检测。

我已经打印了set传入参数,比如instance其实就是我们传入的student这个对象也就是(self),而value其实就是age的值。既然这两个最重要的东西都传进来了,那么我们就可以在set函数里面随意的添加我们的业务逻辑检查了(比如一开始说到的参数预检测)

5ecd0ac2f450698a18f8963d6ec7ad55.png

这里的设计有点复杂,我们分几个方面讲:

1).如果传入的value进行类型检查,如果不是int ,报错

2).如果传入的value是年龄并且<0,报错

3).如果传入的value是成绩并且<0 或者>100,报错

4).如果以上都不满足,说明我们输入的参数是正确的,我们需要把这个属性添加到我们的类里面,这样就可以方便的s.age进行调用

3aa7165061d650725eb0916c4e051ee6.png

这样的话,我们在外边使用这个student对象的时候,可以非常简单和轻松,而复杂的逻辑都封装到了IntField里面,如果我们代码要扩展比如增加一些类似的int参数,代码只要增加一行,是不是感觉自己Python高手了一点。

好,今天的分享就到这里,我们的假装Python系列才刚刚开始,欢迎在留言区指导工作,你品,你细品。


 

 

 

 

 

推荐阅读:

入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径

量化: 定投基金到底能赚多少钱?  | 我用Python对去年800只基金的数据分析

干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影

趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!

AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案


 

 

 

 

 

 


 

 

 
点阅读原文,领AI全套资料!
Python中ModuleNotFoundError: No module named ‘sklearn‘ 根因诊断与修复 ModuleNotFoundError 是 Python 导入模块失败的通用错误,本质反映解释器在 sys.path 搜索路径中未能定位目标模块。其核心原理在于 Python 的模块发现机制——按顺序遍历 sys.path 中的目录,查找匹配的包名或模块文件。该错误的技术价值在于暴露环境隔离、解释器绑定、权限控制等关键工程实践短板,常见于数据分析、机器学习建模及自动化部署场景。真实原因往往不是‘未安装’,而是‘装错环境’或‘路径不可见’,如虚拟环境未激活、conda 与 pip 混用、Jupyter 内核错 阅读详情

相关推荐

Python用户输入等待的正确姿势:从input到select与asyncio

在Python中实现‘等待用户输入’本质是I/O就绪控制,而非时间延迟。其底层依赖操作系统对stdin的阻塞式read调用或事件驱动机制,涉及文件描述符就绪检测、信号中断响应和跨平台终端抽象等核心原理。技术价值在于避免CPU空转、保障交互实时性、支持超时与多路复用,并满足安全合规要求。典型应用场景包括命令行脚本、工业控制多设备监听、异步服务交互及GUI密码采集。本文深入解析input()的缓冲行为、select模块的跨平台就绪监控、asyncio的协程化封装,以及getpass等安全输入实践。

weixin_30265103的博客 297

python 描述符类_python的黑魔法--描述符

python的黑魔法描述符官方定义:python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问。这些方法有 get(), set(), 和delete()。如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符。简单地说: 某个类,只要是内部定义了方法 __get__, __set__, __delete__ 中的一个或多个,就可以称为描述符但是描述符...

weixin_42502545的博客 400

Agent开发学习路径:从Python到K8s的五步扎实进阶

Agent并非黑箱魔法,而是融合业务逻辑、工具编排与基础设施协同的软件系统。其底层依赖Python环境确定性、Linux进程与资源管理、容器化封装规范、Kubernetes声明式调度能力,最终才支撑起感知-决策-执行的智能体闭环。掌握Agent开发,本质是构建端到端的可观测性与可验证性——从pip版本锁、ulimit调优、非root容器启动,到K8s事件驱动调试,每一步都需扎根真实系统行为。本文聚焦零基础学习者如何避开‘速成陷阱’,以Ubuntu 24.04为实验场,通过Python→Linux→容器→K8

clt3617的博客 388

python中 什么是描述符?

python 描述符

阿常呓语的专栏 2044

Python3-aiohttp:高性能异步HTTP客户端与服务器开发框架

..注意:- 某些头部如Host是由库自动计算的,不应手动覆盖;推荐统一在会话层设置,避免重复书写。aiohttp不只是一个异步 HTTP 库,它是通往现代高性能 Python 应用的大门。当你掌握了它的核心理念:用协程替代线程,用事件循环驱动 I/O,用中间件组织逻辑,你会发现,无论是做爬虫、微服务、API 网关还是实时系统,都能以极低的资源消耗支撑极高的并发。“工具决定思维。当你习惯了await而不是threading。

weixin_42605397的博客 1088

保姆级教程:在Davinci Configurator里配置BswM的ECU状态机(附状态切换流程图)

本文提供了一份详细的AUTOSAR BswM模块配置指南,通过Davinci Configurator工具实现ECU状态机的构建与管理。内容涵盖从模式请求端口创建到状态切换规则定义的全流程,特别针对Ecu State Handling进行了深入解析,并附有状态切换流程图,帮助汽车电子工程师高效完成ECU状态管理配置。

weixin_28366475的博客 410

python描述符详解_python 什么叫描述符类? 描述符类详解(特别说明:在描述符类中,self指的是描述符类的实例)...

描述符类:作用:描述另外一个类的属性(类包括属性和方法)定义:至少实现了get()、set()、delete()中的一个_ get_():调用一个属性时触发_ set_():为一个属性赋值时触发_ delete_():采用del删除属性时触发class Colour:``` Colour为描述符类```def __get__(self, instance, owner):print('self i...

weixin_39832643的博客 170

Vivado IP核与License许可全解析:从免费到收费,从评估到部署

本文全面解析Vivado IP核与License许可机制,从免费到收费IP核的选型指南到License的申请与部署策略。详细介绍了Xilinx官方IP核的优势与局限,第三方IP核的风险与应对,以及实战中的资源优化技巧和版本兼容性问题,帮助开发者高效利用Vivado工具链。

weixin_29169505的博客 366

Python系列 67 描述符类

描述符类 我们在之前接触了代理属性@property装饰器,它其实就是一个描述符,本质上而言是一个新式类。 如果想自定义一个描述符类,则必须实现以下三种双下方法的任意一个或多个: __get__():获取描述符类实例时,触发该方法 __set__():设置描述符类实例时,触发该方法 __delete__():删除描述符类实例时,触发该方法 于此同时还需要注意在定义描述符类时的2点细节: 描述符类本身应该定义成新式类,被代理的类也应该是新式类 必须把描述符实例定义成这个类的类属性,不能定义到__init

weixin_43422005的博客 369

AI图像识别在临电配电箱安全检测中的应用与实践

计算机视觉与AI图像识别技术正逐步改变传统工业检测方式。通过深度学习模型如YOLOv5和ResNet,系统能自动识别设备元件并分析其状态,大幅提升检测效率和准确性。这种技术特别适用于需要严格遵循行业标准的场景,如临电配电箱的安全检测。将《施工现场临时用电安全技术规范》等条文转化为可量化的算法,AI系统能自动检查PE线连接、漏保功能等关键项目。实际应用表明,此类解决方案可使电气事故率下降90%以上,同时检测耗时缩短80%,为工地安全提供了智能化保障。

weixin_29042035的博客 328

开源数显表

开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文

m0_70934529的博客 435

类的描述符

描述符的定义 描述符本质就是新式类,在这个新式类中,至少实现了__get__()、set()、delete()中的一个,这也被称为描述符协议 _ get_():调用一个属性时触发 _ set_():为一个属性赋值时触发 _ delete_():采用del删除属性时触发 描述符作用 定义一个描述符: class Foo: def __get__(self, instance, owner):...

weixin_43690603的博客 814

从零开始学DAG:用dagitty软件快速构建因果图的5个步骤

本文为初学者提供了使用dagitty软件快速构建因果图的5个实用步骤。通过一个公共卫生研究实例,详细演示了如何从定义核心变量开始,逐步引入混杂、中介和碰撞变量,最终利用dagitty的自动分析功能识别最小充分调整集,从而科学指导研究设计与统计分析,有效提升因果推断的严谨性。

ii567的博客 799

爽翻!STM32F103 USB HID踩坑后标准库通杀版,比同硬件115200快N倍

官方Demo的默认报告描述符是10个字节?我直接砍成简单的自定义输入输出都是64字节——别纠结为什么选64,这是USB FS HID全速设备的单包最大长度(而且标准外设库给的端点缓冲区默认也配了这个,改起来麻烦)。我直接把官方usbdesc.c里的HID// usb_desc.c 自定义双向HID报告描述符// 碎碎念:别用数组大小自动算的0x09,0x00那种,怕数错直接把官方给的鼠标头尾和中间砍干净留输入输出就行。

LqKKsNUdXlA的博客 339

用豆包+Skill从零制作AI漫剧:分镜、画面、配音到成片全流程

AI漫剧作为一种新兴内容形态,结合AI绘画与AI视频生成技术,正在改变短视频创作方式。其核心原理是利用提示词工程,将创意转化为结构化分镜脚本,再通过豆包等AI助手的Skill能力,将重复的脚本生成和分镜拆解流程固化为可复用的指令模板,从而大幅降低从构思到成品的生产门槛。这种模式无需剧组、演员和实景拍摄,让个人创作者也能借助图像生成、TTS配音与剪辑合成工具,批量化地生产剧情短片,适用于短视频平台连载、商业定制与个人IP打造。围绕豆包+Skill这条主线,从选题、剧本写作、分镜表设计,到画面提示词生成、视频片

weixin_29048309的博客 1472

浪涌抗扰度部分解读

8.3 测试仪器: 8.3.1浪涌发生器(对于连接到对称通信线的接口采用10/700us的组合波发生器;对于其他情况采用1.2/50us(8/20us)组合波发生器,输出极性正负可调、移相范围0-360°可调,最大重复率至少每分钟1次,开路输出电压0.5-4kV,电源线的话有效效输出阻抗为2Ω,通信线的话有效输出阻抗为40Ω) 8.3.2 耦合/去耦网络 8.3.3 参考接地平板 8...

喵叫兽的博客 2503

Python魔法方法模拟:从单元测试到高级调试的实战指南

在Python编程中,魔法方法(Magic Methods)是对象行为控制的核心机制,它们定义了对象在特定操作下的响应逻辑。理解其工作原理是掌握Python面向对象编程的关键。通过模拟这些方法,开发者可以在不依赖外部资源的情况下,对代码逻辑进行精准测试和调试,这大大提升了单元测试的可靠性和执行效率。在工程实践中,这一技术尤其适用于隔离数据库、网络请求等不稳定依赖,确保测试的独立性和可重复性。本文聚焦于使用unittest.mock模块中的MagicMock类,深入讲解如何模拟__getitem__、__it

366

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

广州嘉为科技有限公司,Python面试问的面试题目!!!

岗位是Python开发工程师(J10184) 面试问的问题我给大家总结一波,有些忘记了,下面的是我自己个人的见解,不过我是建议大家去百度的???? 一、mysql 相关的 主从数据库是如何同步的? 1、主数据库进行插入更新删除等操作时,会即时把日志写到主数据库日志文件(binary log events)里面。 2、这时候,会把日志通过网络发送给从数据库,一般是3306端口。从数据库把日志拷贝到中继日志里面(relay log) 3、从数据库会把日志事件一条条拿出来执行。 4、一般是用来做读写分离,只用

yytasty的博客 1321

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

快速理解树莓派Python中断处理机制原理

深入剖析树莓派上Python中断处理的工作原理,解析信号响应与事件触发机制,帮助开发者更好地掌握树莓派在实时任务中的应用技巧。

weixin_36212459的博客 285

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用VHF框架实现一个虚拟HID键盘

qQ708kow3的博客 209

Wrapture:让Python函数追踪与测试替换共用一条链路

在Python开发中,函数调用链的观测与依赖隔离是工程实践的核心难题。开发者通常依赖装饰器实现调用日志,或用unittest.mock替换外部依赖,但两者本质都在“包裹函数”——一个负责观察,一个负责篡改。然而,朴素装饰器难以应对签名失真、描述符协议、递归与并发开销;mock则常因路径错误或生命周期泄漏而污染测试。Wrapture作为一款专注函数追踪与测试替换的库,试图将观察与替换收敛为同一条可插拔链路:业务代码无需感知自身被记录或被替换,即可在开发调试、单元测试、线上诊断等场景间无缝切换。通过稳定的包裹层

weixin_33970449的博客 331

GreatFET One实战:从USB抓包到HID模拟与安全研究

USB协议是设备通信的基石,但其底层数据交互对普通开发者而言如同黑盒。理解USB枚举、控制传输与事务处理,往往需要借助逻辑分析仪抓取物理信号,或通过设备模拟器主动构造交互。GreatFET One作为一款开源软硬件平台,将USB协议分析、HID设备模拟、中间人代理和通用调试接口集成于一体,为协议研究与安全测试提供了低门槛入口。本文基于实际折腾经验,从环境搭建、抓包分析、BadUSB模拟、中间人攻击到非USB扩展玩法,梳理了关键技术点与常见坑点。通过Wireshark解读枚举过程,用Python脚本模拟键盘鼠

weixin_34129696的博客 391
上一篇: Web版VS Code上线:最好用的IDE终于发布网页版,然而微软发完秒删!
下一篇: 好家伙!六成大学生认为自己毕业10年内会年入百万!看来是我格局小了。。...
菜鸟学Python
博客等级 码龄9年 8036粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值