首页 » 网站推广 » phpsetget感化技巧_Python的设计照样很精妙的三分钟理解__get__和__set__

phpsetget感化技巧_Python的设计照样很精妙的三分钟理解__get__和__set__

访客 2024-11-18 0

扫一扫用手机浏览

文章目录 [+]

作者:麦叔

来源:麦叔编程

phpsetget感化技巧_Python的设计照样很精妙的三分钟理解__get__和__set__

背景

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

phpsetget感化技巧_Python的设计照样很精妙的三分钟理解__get__和__set__
(图片来自网络侵删)

麦叔之前有讲过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_nom1 = Maiyou('Kevin', 18, '1234567890')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_nom1 = Maiyou('Kevin', 18, '1234567890')print(m1.name)print(m1.age)print(m1.get_id_no())m1.set_id_no('66666666666')

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

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

文艺青年的做法 - 利用descriptor

Descriptor,中文名字是描述器。
它是一种分外的类,它的浸染是用来封装一个属性。
它的特色便是须要有__get__和__set__函数

我们来看一下利用了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_nom1 = Maiyou('Kevin', 18, '1234567890')m1.id_nom1.id_no = '66666666666'm2 = Maiyou('Yushao', 16, '9876543210')m1.id_nom1.id_no = '888888888'

输出结果:

age从1234567890更新为: 1234567890获取age: 1234567890age从66666666666更新为: 66666666666age从9876543210更新为: 9876543210获取age: 66666666666age从888888888更新为: 888888888

阐明一下:

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

可能知识轻微有点深,由于麦友的水平也正在逐步加深。
多看两遍,细细品味,有问题给我留言。

标签:

相关文章

四川谷歌SEO攻略,助力企业迈向国际市场

越来越多的企业开始重视网络营销,其中谷歌SEO成为企业提升品牌知名度和拓展国际市场的关键手段。作为全球最大的搜索引擎,谷歌拥有庞大...

网站推广 2025-04-04 阅读0 评论0