2025年Python的设计还是很精妙的,三分钟理解__get__和__set__

Python的设计还是很精妙的,三分钟理解__get__和__set__背景 这是某位粉丝 提的问题 可惜我忘记记录名字了 如果当事人看到 请在评论留言 我给你置顶 感谢 小天才之前有讲过 python 的 call get getattr getattribute 这几个方法吗 网上搜索的讲的都不透彻 烦请小天才讲解下吧

大家好,我是讯享网,很高兴认识大家。

背景

这是某位粉丝提的问题,可惜我忘记记录名字了。如果当事人看到,请在评论留言,我给你置顶,感谢。

❝ 小天才之前有讲过python的 call(),get, getattr,
__getattribute__这几个方法吗,网上搜索的讲的都不透彻,烦请小天才讲解下吧😭

其他几个我们都聊过了,今天我们来聊最后一个__get__,以及它的搭档__set__

抛出问题

借用昨天的例子,有一个类Maiyou,它有3个属性:name,age和id_no。

class Maiyou(): def __init__(self,name, age, id_no): self.name=name self.age=age self.id_no = id_no m1 = Maiyou('Kevin', 18, '') print(m1.name) print(m1.age) print(m1.id_no) 

讯享网

因为身份证id_no很敏感,我们希望每次读取或者修改这个属性的时候都能打印一句日志,记录一下。

在实际工作中,我们可以在这里做权限控制,只有传入了秘钥才可以访问。今天我们就简化为打印日志。

普通青年的方法

普通的方法,我们可以

  • 把这个属性的名字改为_id_no,前面加了下划线,表示是私有变量,外界不能访问。
  • 添加专门的访问方法:get_id_no和set_id_no。外面需要访问就通过方法来访问。这也是比较「夹里夹气」的方法。
讯享网class Maiyou(): def __init__(self,name, age, id_no): self.name=name self.age=age self._id_no = id_no def get_id_no(self): return self._id_no def set_id_no(self, id_no): self._id_no = id_no m1 = Maiyou('Kevin', 18, '') print(m1.name) print(m1.age) print(m1.get_id_no()) m1.set_id_no('') 

很明显这个方法比较繁琐。

我们可以通过@property装饰器,让它更方便一点,但超出了本3分钟的范围了。因为今天的重点是descriptor,这也是这个场景中最正确的做法。

文艺青年的做法 - 使用descriptor

我们来看一下使用了descriptor的例子:

class IdDescriptor: def __get__(self, obj, objtype=None): value = obj._id_no print(f'获取age: {value}') return value def __set__(self, obj, value): obj._id_no = value print(f'age从{obj._id_no}更新为: {value}') class Maiyou(): id_no = IdDescriptor() def __init__(self,name, age, id_no): self.name=name self.age=age self.id_no = id_no m1 = Maiyou('Kevin', 18, '') m1.id_no m1.id_no = '' m2 = Maiyou('Yushao', 16, '') m1.id_no m1.id_no = '' 

输出结果:

讯享网age从更新为:  获取age:  age从更新为:  age从更新为:  获取age:  age从更新为:  

解释一下:


讯享网

  • 我们定义了一个描述器类IdDescriptor来表示身份证号。它提供了__get__和__set__方法,用于设置属性的值。
  • 它的set方法会给当前对象设置一个私有属性,并且打印日志;它的get方法会返回当前对象的私有属性。
  • 在Maiyou类中,我们创建了一个描述器实例作为类属性id_no。这样每次调用这个属性的时候,就会触发相应的set和get方法。

可能知识稍微有点深,因为粉丝的水平也正在逐步加深。多看两遍,细细品味,有问题给我留言。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

小讯
上一篇 2025-02-24 21:01
下一篇 2025-03-08 19:54

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/75965.html