返回介绍

特性

发布于 2024-01-29 22:24:14 字数 817 浏览 0 评论 0 收藏 0

特性协议允许我们把一个特定属性的get和set操作指向我们所提供的函数或方法,使得我们能够插入在属性访问的时候自动运行的代码,拦截属性删除,并且如果愿意的话,还可为属性提供文档。

通过property内置函数来创建特性并将其分配给类属性,就像方法函数一样。同样,可以通过子类和实例继承属性,就像任何其他类属性一样。它们的访问拦截功能通过self实例参数提供,该参数确保了在主体实例上访问状态信息和类属性是可行的。

一个特性管理一个单个的、特定的属性;尽管它不能广泛地捕获所有的属性访问,它允许我们控制访问和赋值操作,并且允许我们自由地把一个属性从简单的数据改变为一个计算,而不会影响已有的代码。正如你将看到的,特性和描述符有很大的关系,它们基本上是描述符的一种受限制的形式。

基础知识

可以通过把一个内置函数的结果赋给一个类属性来创建一个特性:

这个内置函数的参数都不是必需的,并且如果没有传递参数的话,所有都取默认值None。这样的操作是不受支持的,并且尝试使用默认值将会引发一个异常。当使用它们的时候,我们向fget传递一个函数来拦截属性访问,给fset传递一个函数进行赋值,并且给fdel传递一个函数进行属性删除;doc参数接收该属性的一个文档字符串,如果想要的话(否则,该特性会赋值fget的文档字符串,如果提供了fget的文档字符串的话,其默认值为None)。fget返回计算过的属性值,并且fset和fdel不返回什么(确实是None)。

这个内置的函数调用返回一个特性对象,我们将它赋给了在类的作用域中要管理的属性的名称,正是在类的作用域中每个实例都继承了类。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文