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-类与对象 如何创建可管理的对象属性 (图文并茂)

python-类与对象 如何创建可管理的对象属性 (图文并茂)

python类与对象-如何使用描述符对实例属性做类型检查

Python学习之属性访问与描述符详解

python描述符详解