Python 描述符详解
Python 中的描述符是一种机制,用于控制属性(attribute)的访问。通过描述符,我们可以在属性被访问或者修改时加入特定的逻辑。
描述符是一个类,其中至少定义了以下三个方法:
__get__(self, instance, owner)
:当属性被访问时调用;__set__(self, instance, value)
:当属性被修改时调用;__delete__(self, instance)
:当属性被删除时调用。
描述符的使用
通常情况下,可以通过定义属性来实现对类的属性访问的控制。比如:
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
在使用时,我们可以通过 person.name
和 person.name=
的方式来访问和修改 Person
的 name
属性。
但是,如果我们需要做更多的控制,比如让属性只读或者只能使用特定的数据类型,那么使用描述符会更加方便。
例如,我们可以定义一个只能为正整数的属性 PositiveInteger
:
class PositiveInteger:
def __set_name__(self, owner, name):
self.name = name
def __set__(self, instance, value):
if value <= 0:
raise ValueError(f"`{self.name}` should be positive")
instance.__dict__[self.name] = value
def __get__(self, instance, owner):
return instance.__dict__[self.name]
然后,我们将 PositiveInteger
应用到 Person
类的 age
属性上:
class Person:
age = PositiveInteger()
def __init__(self, name, age):
self.name = name
self.age = age
现在,当我们试图将 Person
的 age
赋值为负数时,就会抛出 ValueError
异常。
描述符的优先级
当一个类定义了多个同名的描述符时,Python 会按照以下优先级进行调用:
- 对象的属性优先级最高,如果实例中存储了同名的属性,则直接返回该属性;
- 如果类定义了
__set__()
方法,则直接调用该方法; - 如果类定义了
__get__()
方法,则直接调用该方法; - 如果类定义了
__delete__()
方法,则直接调用该方法; - 如果类定义了
__set__()
和__get__()
方法,则 Python 会视操作(访问还是修改)分别调用这两个方法。
结论
描述符是 Python 中非常有用的一个特性。通过定义描述符,我们可以对类的属性访问进行更加细粒度的控制。在实际的编程中,我们可以将描述符应用到各种场景中,比如只读属性、类型检查等等。
同时,需要注意的是,描述符的优先级非常高,因此在使用时需要注意不要覆盖掉同名的属性。另外,描述符的调用顺序也需要特别关注,以免产生不必要的问题。
最后的最后
本文由chatgpt生成,文章没有在chatgpt
生成的基础上进行任何的修改。以上只是chatgpt
能力的冰山一角。作为通用的Aigc
大模型,只是展现它原本的实力。
对于颠覆工作方式的ChatGPT
,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。
🧡AI职场汇报智能办公文案写作效率提升教程 🧡 专注于AI+职场+办公
方向。
下图是课程的整体大纲
下图是AI职场汇报智能办公文案写作效率提升教程
中用到的ai工具
🚀 优质教程分享 🚀
- 🎄可以学习更多的关于人工只能/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 AI职场汇报智能办公文案写作效率提升教程 🧡 | 进阶级 | 本课程是AI+职场+办公的完美结合,通过ChatGPT文本创作,一键生成办公文案,结合AI智能写作,轻松搞定多场景文案写作。智能美化PPT,用AI为职场汇报加速。AI神器联动,十倍提升视频创作效率 |
💛Python量化交易实战 💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |