python基础知识学习——描述符

本文深入探讨Python中的描述符,解释其含义、作用和分类。描述符作为Python类特性的底层实现,用于代理类的属性。文章详细讲解了数据描述符和非数据描述符的区别,以及描述符的优先级规则。通过实例展示了描述符在限制属性类型、类装饰器和延迟计算等方面的实用应用。
摘要由CSDN通过智能技术生成

1.描述符的含义:

  • 首先我们来看官方怎么给我们定义描述符的吧
  • 描述符就是一个“绑定行为“的对象属性,在描述符协议中,它可以通过方法充写属性的访问。这些方法有**get(),set(),delete()**,如果这些方法中任何一个被定义在一个对象中,这个对象就是一个描述符.
  • 我理解的描述符就是对一个“辅助类”的作用,它负责对另一个类进行代理,描述类的对象(包括属性、方法等等)。

2.描述符的作用:

  • 描述符的作用是用来代理一个类的属性,需要注意的是描述符不能定义在被使用类的构造函数中,只能定义为类的属性(因为这与描述符的优先级相关),它只属于类的,不属于实例,我们可以通过查看实例和类的字典来确认这一点。

  • 描述符是实现大部分Python类特性中最底层的数据结构的实现手段,我们常使用@classmethod、@staticmethd、@property、甚至是__slots__等属性都是通过描述符来实现的。它是很多高级库和框架的重要工具之一,是使用到装饰器或者元类的大型框架中的一个非常重要组件。

3.描述符的分类:

  1. 数据描述符:必须实现__get__()和__set__() ,可以没有实现__delete__()方法
  2. 非数据描述符:没有实现__set__()

4.描述符的注意点:

  1. 描述符本身应该定义成新式类,被代理的类也应该是新式类
  2. 必须把描述符定义成这个类的类属性,不能定义到这个类的构造函数中
  3. 要严格遵循该优先级,优先级由高到低分别为:
    1. 类属性
    2. 数据描述符
    3. 实例属性
    4. 非数据描述符
    5. 找不到的属性触发__getattr__()

5.描述符格式:

  • 说了这么多,那到底描述符长什么样呢?来看一段代码吧
class myDescriptor:
    def __get__(self, instance, owner):
        print("\n--->这是get方法")
        print("self:", self)
        print("instance:", instance)
        print("owner:", owner)

    def __set__(self, instance, value):
        print("\n--->这是set方法")
        print("self:", self)
        print("instance:", instance)
        print("value:", value)

    def __delete__(self, instance):
        print("\n--->这是delete方法")
        print("self:", self)
        print("instance:", instance)

class People:
    name = myDescriptor()
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = People("xiaoming", 18)
p.name
del p.name
#下面是测试输出的结果:
--->这是set方法
self: <__main__.myDescriptor object at 0x00000247BC153588>
instance: <__main__.People object at 0x00000247BC153A90>
value: xiaoming

--->这是get方法
self: <__main__.myDescriptor object at 0x00000247BC153588>
instance: <__main__.People object at 0x00000247BC153A9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值