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__
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值