python-类与对象 详解属性描述符(图文并茂)
Posted 温柔且上进c
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-类与对象 详解属性描述符(图文并茂)相关的知识,希望对你有一定的参考价值。
属性描述符
属性描述符的介绍
- 它是一个强大的通用协议
- 它是
properties, methods, static methods, class methods 和super()
的调用原理 - 它是针对某一个类的而言的
属性描述符作用
- 属性描述符的作用与
@property装饰器
的作用相同,可以实现在形式上是属性访问,但是实际上却是内部调用方法 - 不同点:
@property装饰器
的复用性很差,当我们有两个属性需要使用同样的方法来获取或设置值时,需要定义两个@property装饰器
才可以,复用性极差,而属性描述符直接调用即可实现!!
属性描述符协议
- 属性描述符就是实现了特定协议的类,只要实现了
__get__,__set__和__del__
三个方法中的任意一个,这个类就是某个类的属性描述符
- 它能实现对多个属性相同的
设置数据、获取数据
逻辑的一种方式,简单来说就是:创建一个实例,作为另一个类的类属性
代码解释
- 定义一个IntField类为描述符类
- 创建IntField类的实例,作为另一个User类的属性来实现某种逻辑
# 定义属性描述符类
class InterFiled(object):
def __set__(self, instance, value):
pass
def __get__(self, instance, owner):
pass
def __del__(self):
pass
# 定义User类,需要使用属性描述符类中的某个逻辑
class User(object):
# User类中的age属性需要使用定义好的属性描述符
age = InterFiled()
# 实例化
ycx = User()
# 调用实例描述符中的__set__
ycx.age = 18
# 调用实例描述符中的__get__
print(ycx.age)
# 调用实例描述符中的__del__
del ycx.age
- 上述就是,属性描述符的原型,具体的业务逻辑,需要你在
__get__,__set__和__del__
中实现
注意
- 如果一个对象同时定义了
__get__和__set__
方法,它被称做数据描述符(data descriptor)。 - 只定义
__get__
方法的对象则被称为非数据描述符(non-data descriptor)
实现需求
- 定义一个属性描述符类,再定义一个User类,实现User类中的age属性,如果age的值为int类型,则将age的值设置为此值,否则抛出异常!!
- 代码实现:
# 定义属性描述符
class InterFiled(object):
def __set__(self, instance, value):
# value 为你使用属性描述符时,传过来的参数值
if not isinstance(value, int):
raise TypeError('Type Error')
self.val = value
def __get__(self, instance, owner):
# 返回刚才设置的值
return self.val
def __del__(self):
pass
# 定义User类
class User(object):
age = InterFiled()
ycx = User()
ycx.age = 18
print(ycx.age)
- console输出:
- 上述已经实现了User类中的age属性的先判断后设置值
- 当我们还需要某个属性的判断方法与age属性的判断方法相同时,直接调用属性描述符即可!!
调用顺序
当为数据描述符时, __get__优先级高于__dict__
当为非数据描述符时,__dict__优先级高于__get__
以上是关于python-类与对象 详解属性描述符(图文并茂)的主要内容,如果未能解决你的问题,请参考以下文章
python-类与对象 如何创建可管理的对象属性 (图文并茂)
python-类与对象 如何创建可管理的对象属性 (图文并茂)