Python描述符的用法介绍(附示例)


当前第2页 返回上一页

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

使用描述符

首先看一下描述符的概念

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

class NotNegative():

    def __init__(self,name):

        self.name = name

 

    def __set__(self, instance, value):

        if value < 0:

            raise ValueError(self.name+' must be >= 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部分进行的操作

1

instance.__dict__[self.name] = value

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

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

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

以上就是Python描述符的用法介绍(附示例)的详细内容,更多文章请关注木庄网络博客!!

返回前面的内容

相关阅读 >>

字典里添加元素有哪些方法

Python文件操作的介绍(代码示例)

如何判断一个字符串是数字

Python用什么解释器?

Python中pylint使用方法(pylint代码检查)_Python

Python中正则表达式的应用讲解

Python环境下安装mysqldb模块

Python怎么念

spyder和Python的关系是什么

Python2.7和3.7的区别

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...