property属性的用处roperty 动态属性和特性详解




property属性的用处roperty 动态属性和特性详解

2022-07-21 2:24:41 网络知识 官方管理员


在Python开发时,考虑到安全性,我们会通过使用'__'定义私有属性,以限制类外或者子类都不能直接进行访问、操作。但同时,这些私有属性并不是一成不变的,所以我们还需要提供私有属性的对外操作方式。通常,我们使用PythonProperty动态属性来实现。

PythonProperty的应用场景:

  • 限制属性的特征,比如成绩不能是负分。
  • 属性动态变化,比如年龄属性随着时间而变化。
  • 限制属性的只读属性。

property属性的用处(roperty动态属性和特性详解)(1)

如上,我们创建了一个Student类,我希望通过实例来获取每个学生姓名,成绩信息。其中我们将学生成绩信息设置为类的私有属性(__score),我们可以通过如下自定义方法调用自定义方法对私有属性进行操作

property属性的用处(roperty动态属性和特性详解)(2)

我们可以通过调用get_score、set_score方法实现对学生成绩的读写,如下:

property属性的用处(roperty动态属性和特性详解)(3)

我们通过自定义方法实现了对外提供私有属性的访问方式,但我们发现,在使用的过程中需要频繁的调用自定义方法,如Tony.set_score(999),使得代码并不够简洁。

接下来我们就来介绍一下property。首先,我们可以通过调用property方法对get_score,set_score方法进行封装,然后操作私有属性。

property语法

property属性的用处(roperty动态属性和特性详解)(4)

参数

  • fget:获取属性值的函数名。
  • fset:设置属性值的函数名。
  • fdel:删除属性值函数名。
  • doc:属性描述信息。

property属性的用处(roperty动态属性和特性详解)(5)

上面使用property方法对get_score,set_score方法进行封装,同样实现了访问私有属性的目的,但是这种方式还是比较麻烦的。

接下来,我们在尝试直接使用property修饰同名函数的形式,来实现对私有属性的访问操作,这也是实际开发应用中最常简的一种方式,如下:

property属性的用处(roperty动态属性和特性详解)(6)

如下,当访问、更新、删除私有属性时,该如何使用property进行修饰。

property属性的用处(roperty动态属性和特性详解)(7)

通过上面代码执行结果,我们可以发现:

  • 获取私有属性时,自动触发执行被@property修饰的score方法,默认执行getter的方法。
  • 设置私有属性时,自动触发执行被@score.setter修饰的score方法。
  • 删除私有属性时,自动触发执行被@score.deleter修饰的score方法。

需要注意的是在Python经典类中的属性只有一种访问方式,其对应被@property修饰的方法。在新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法。

假如此时,我们发现Tony的成绩是999,原来是不小心多输入的了一个9,我们需要在对私有属性赋值时进行限制,如下:

property属性的用处(roperty动态属性和特性详解)(8)

我们在被@score.setter修饰的score方法中增加了成绩的范围判断,此时当我们执行Tony.score=999时,因999不符合限制条件,则会抛出ValueError:scoreinvalid异常。

假如现在要求不允许成绩信息被录入后进行任何修改,我们需要把私有属性设置为只读,方法很简单,把setter部分注释掉就可以了,如下。

property属性的用处(roperty动态属性和特性详解)(9)

发表评论:

最近发表
网站分类
标签列表