python散装笔记——128: 描述符

python散装笔记——128: 描述符1 简单描述符描述符有两种类型 数据描述符和非数据描述符 数据描述符是指定义了 get 和 set 方法的对象 而非数据描述符只定义了 get 方法 这种区别在考虑覆盖和实例字典的命名空间时非常重要

欢迎大家来到IT世界,在知识的湖畔探索吧!

1: 简单描述符

描述符有两种类型:数据描述符和非数据描述符。数据描述符是指定义了__get__()__set__()方法的对象,而非数据描述符只定义了__get__()方法。这种区别在考虑覆盖和实例字典的命名空间时非常重要。如果数据描述符和实例字典中的条目同名,则数据描述符将优先。然而,如果非数据描述符和实例字典中的条目同名,则实例字典中的条目将优先。

要创建一个只读的数据描述符,可以定义__get__()__set__()方法,并在__set__()方法中抛出AttributeError。定义一个抛出异常的__set__()方法就足以使其成为一个数据描述符。

 descr.__get__(self, obj, type=None) --> value descr.__set__(self, obj, value) --> None descr.__delete__(self, obj) --> None

欢迎大家来到IT世界,在知识的湖畔探索吧!

以下是实现示例:

欢迎大家来到IT世界,在知识的湖畔探索吧! class DescPrinter(object): """一个记录活动的日志数据描述符。""" _val = 7 def __get__(self, obj, objtype=None): print('正在获取 ...') return self._val def __set__(self, obj, val): print('正在设置', val) self._val = val def __delete__(self, obj): print('正在删除 ...') del self._val class Foo(): x = DescPrinter() i = Foo() i.x # 输出: # 正在获取 ... # 7 i.x = 100 # 输出: # 正在设置 100 i.x # 输出: # 正在获取 ... # 100 del i.x # 输出: # 正在删除 ... i.x # 输出: # 正在获取 ... # 7
python散装笔记——128: 描述符

欢迎大家来到IT世界,在知识的湖畔探索吧!

2: 双向转换

描述符对象可以允许相关对象属性自动响应变化。

假设我们想要模拟一个振荡器,其具有给定的频率(以赫兹为单位)和周期(以秒为单位)。当我们更新频率时,我们希望周期自动更新;当我们更新周期时,我们希望频率自动更新:

 >>> oscillator = Oscillator(freq=100.0) # 将频率设置为100.0赫兹 >>> oscillator.period # 周期是频率的倒数,即0.01秒 0.01 >>> oscillator.period = 0.02 # 将周期设置为0.02秒 >>> oscillator.freq # 频率自动调整 50.0 >>> oscillator.freq = 200.0 # 将频率设置为200.0赫兹 >>> oscillator.period # 周期自动调整 0.005

我们选择其中一个值(频率,以赫兹为单位)作为“锚点”,即可以直接设置而无需转换的值,并为其编写一个描述符类:

欢迎大家来到IT世界,在知识的湖畔探索吧! class Hertz(object): def __get__(self, instance, owner): return self.value def __set__(self, instance, value): self.value = float(value)

另一个值(周期,以秒为单位)是基于锚点定义的。我们编写一个描述符类来完成转换:

 class Second(object): def __get__(self, instance, owner): # When reading period, convert from frequency return 1 / instance.freq def __set__(self, instance, value): # When setting period, update the frequency instance.freq = 1 / float(value)

现在我们可以编写Oscillator类:

欢迎大家来到IT世界,在知识的湖畔探索吧! class Oscillator(object): period = Second() # Set the other value as a class attribute def __init__(self, freq): self.freq = Hertz() # Set the anchor value as an instance attribute self.freq = freq # Assign the passed value - self.period will be adjusted
python散装笔记——128: 描述符

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/114536.html

(0)
上一篇 12小时前
下一篇 11小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信