搜索
首页后端开发Python教程Python描述符的用法介绍(附示例)

本篇文章给大家带来的内容是关于Python描述符的用法介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

作为一位python的使用者,你可能使用python有一段时间了,但是对于python中的描述符却未必使用过,接下来是对描述符使用的介绍

场景介绍

为了引入描述符的使用,我们先设计一个非常简单的类:

class Product():

    def __init__(self,name,quantity,price):
        self.name = name
        self.quantity = quantity
        self.price = price

这是一个商品类,存储该商品的名称,数量与价格。

对于一件商品,我们一般会期望它的数量和价格不会是负值,为了避免这种情况,我们可以在初始化的时候加一些判断,比如下面这样:

class Product():

    def __init__(self,name,quantity,price):
        self.name = name
        if quantity<0:
            raise ValueError(&#39;quantity must be >= 0&#39;)
        self.quantity = quantity
        if quantity<0:
            raise ValueError(&#39;price must be >= 0&#39;)
        self.price = price

但是这样还会有一个弊端就是这样的判断只是加在了初始化的时候,然后在之后对类的实例的属性进行赋值的时候还是无法保证赋的值是大于0 的

于是我们可以使用‘特性’来解决这个问题:

class Product():

    def __init__(self,name,quantity,price):
        self.name = name
        self.quantity = quantity
        self.price = price

    @property
    def quantity(self):
        return self._quantity

    @quantity.setter
    def quantity(self,value):
        if value 10b97145df4db923f92d50adfc4e30b7= 0')
        else:
            self._quantity = value

    @property
    def price(self):
        return self._price

    @price.setter
    def price(self, value):
        if value 7a8126e9d59219bf561e855d47547cf9= 0')
        else:
            self._price = value

book = Product('mybook',6,30)
print(book.quantity)

这里的@property和@quantity.setter是两个装饰器,它可以设置属性的读与写,就相当于读写属性,但其实是执行一个函数,具体有关特性的介绍,可以再自行查找,这里主要是为了引出描述符。

通过特性,可以完成为属性赋值时添加判断。但是当一个类中有更多的属性,很多属性同样需要添加非负数赋值的检查的时候,使用特性这种方式就会显得过于累赘,会有很多的代码重复,也会添加很多装饰器,这时就可以使用描述符来解决这个问题。

使用描述符

首先看一下描述符的概念

描述符就是一个“绑定行为“的对象属性,在描述符协议中,它可以通过方法充写属性的访问。这些方法有get(),set(),delete().如果这些方法中任何一个被定义在一个对象中,这个对象就是一个描述符

(这几个方法是特殊方法,双下划线由于转换未显示)

我们先把上文中的商品类按照使用描述符进行修改:

class NotNegative():
    def __init__(self,name):
        self.name = name

    def __set__(self, instance, value):
        if value 823f97101721fcf4395d8d2ccc669c7c= 0')
        else:
            instance.__dict__[self.name] = value

class Product():
    quantity = NotNegative('quantity')
    price = NotNegative('price')

    def __init__(self,name,quantity,price):
        self.name = name
        self.quantity = quantity
        self.price = price

book = Product('mybook',2,5)

NotNegative是描述符类,它是Product类的类属性

在该例子中,如果执行book.quantity=3,解释器会先查找实例属性,发现有quantity属性,但是解释器又发现同样有一个类属性是描述符,于是解释器最终会选择走描述符这条路。然后因为是描述符,于是会执行描述符中的set特殊方法。

描述符中的set特殊方法的参数有为

self :是描述符实例

instance :是相当于例子中的实例book

value :就是要赋予的值

由于这些属性对于取值没有什么特殊的要求所以例子中没有实现get特殊方法。

get方法同样有3个参数self, instance, owner。self,instance与set中的相同,owner为例子中的Product类

接下来主要看一下描述符set方法中else部分进行的操作

instance.__dict__[self.name] = value

通过调用book实例的dict,直接为dict中的属性赋值,这也是参数中传入实例的一个重要原因。由于描述符对象是作为类属性存在,所以可能会有很多个该类的对象访问,为了防止属性的覆盖,直接存入实例的属性中是妥当的。但这里不能为属性赋值的方式,不然就会陷入死循环当中。

对于数据描述符与非数据描述符,一个类,如果只定义了 get() 方法,而没有定义 set(), delete() 方法,则认为是非数据描述符; 反之,则成为数据描述符。

最后,本文是对描述符的使用做了简单的介绍与讲解,如需更加深入了解可以参考《流畅的Python》属性描述符部分

以上是Python描述符的用法介绍(附示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:博客园。如有侵权,请联系admin@php.cn删除
Python vs. C:了解关键差异Python vs. C:了解关键差异Apr 21, 2025 am 12:18 AM

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

Python vs.C:您的项目选择哪种语言?Python vs.C:您的项目选择哪种语言?Apr 21, 2025 am 12:17 AM

选择Python还是C 取决于项目需求:1)如果需要快速开发、数据处理和原型设计,选择Python;2)如果需要高性能、低延迟和接近硬件的控制,选择C 。

达到python目标:每天2小时的力量达到python目标:每天2小时的力量Apr 20, 2025 am 12:21 AM

通过每天投入2小时的Python学习,可以有效提升编程技能。1.学习新知识:阅读文档或观看教程。2.实践:编写代码和完成练习。3.复习:巩固所学内容。4.项目实践:应用所学于实际项目中。这样的结构化学习计划能帮助你系统掌握Python并实现职业目标。

最大化2小时:有效的Python学习策略最大化2小时:有效的Python学习策略Apr 20, 2025 am 12:20 AM

在两小时内高效学习Python的方法包括:1.回顾基础知识,确保熟悉Python的安装和基本语法;2.理解Python的核心概念,如变量、列表、函数等;3.通过使用示例掌握基本和高级用法;4.学习常见错误与调试技巧;5.应用性能优化与最佳实践,如使用列表推导式和遵循PEP8风格指南。

在Python和C之间进行选择:适合您的语言在Python和C之间进行选择:适合您的语言Apr 20, 2025 am 12:20 AM

Python适合初学者和数据科学,C 适用于系统编程和游戏开发。1.Python简洁易用,适用于数据科学和Web开发。2.C 提供高性能和控制力,适用于游戏开发和系统编程。选择应基于项目需求和个人兴趣。

Python与C:编程语言的比较分析Python与C:编程语言的比较分析Apr 20, 2025 am 12:14 AM

Python更适合数据科学和快速开发,C 更适合高性能和系统编程。1.Python语法简洁,易于学习,适用于数据处理和科学计算。2.C 语法复杂,但性能优越,常用于游戏开发和系统编程。

每天2小时:Python学习的潜力每天2小时:Python学习的潜力Apr 20, 2025 am 12:14 AM

每天投入两小时学习Python是可行的。1.学习新知识:用一小时学习新概念,如列表和字典。2.实践和练习:用一小时进行编程练习,如编写小程序。通过合理规划和坚持不懈,你可以在短时间内掌握Python的核心概念。

Python与C:学习曲线和易用性Python与C:学习曲线和易用性Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器