python 描述符

描述符

目录

1 定义 .

2 为什么要用描述符.

3 描述符的调用机制 .

4 描述符的种类.

5 描述符的参数.


一 定义 :

首先要有一个实现了__get__()、set()和__delete__()中的其中任意一种方法的新式类,

如果一个类有个属性是上述的类的实例化对象,那么这个属性(也就是那个实例化对象),就是一个描述符。

下面代码的m,就是M类的实例对象,而M有那三种方法(get,set,deelte), 所有称m就是描述符

class M:
    def __init__(self, x=1):
        print("经过初始化")
        self.x = x

    def __get__(self, instance, owner):
        print("经过get")

        return self.x

    def __set__(self, instance, value):
        print("经过set")
        self.x = value

    def __delete__(self, instance):
        print("经过delete")



# 调用描述符的类
class AA:
    m = M() # m就是一个描述符

aa = AA()
aa.m
aa.m  = 777
del  aa.m

注意m必须用类属性形式写。

  1. 实例化aa的时候,会先走M的初始化,因为定义类AA的时候,就已经实例化m了
  2. 调用aa.m的时候,会走描述符m的get方法
  3. 给m赋值的时候,会走描述符m的set方法
  4. 删除aa.m 的时候会走delete方法

描述符是加强版的property访问属性其实走的是方法


二 为什么要用描述符 ?

因为可以做类型检查
Python是一个动态类型解释性语言,不像C/C++等静态编译型语言,数据类型在编译时便可以进行验证,而Python中必须添加额外的类型检查逻辑代码才能做到这一点,这就是描述符的初衷.\


三 描述符的调用机制

使用__dict__查看,下面简单说调用aa.m时候的访问顺序
简单说就是先找对象a的dict,没有再去找对象所在的类的dict,还没有再找a的类的父类的dict
期间: 期间找到的是普通值就输出,如果找到的是一个描述符,则调用__get__方法


四 描述符的种类

  • 同时定义了__get__和__set__方法的描述符称为数据描述符
  • 只定义了__get__的描述符称为非数据描述符
  • 二者的区别是:当属性名和描述符名相同时,在访问这个同名属性时,如果是数据描述符就会先访问描述符,如果是非数据描述符就会先访问属性

五 描述符的参数

  1. __get__方法里的instance, owner参数是什么?

  2. __set__里的instance, value是什么?__delete__方法里的instance是什么?

instance是AA的实例化对象aa,owner就是AA这个类对象,value就是设置属性时候传入的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值