高端玩法之描述符(应用及其优先级说明)

什么是描述符,故名思义就是用来描述一个对象的。你记住一个概念,在python中一切皆对象(Linux中一切皆文件)。所以类也是一个对象,描述符本身也是一个类,这个类是用来描述另外一个类的。
语法特点:描述的是另一个类属性,注意只能是类的属性,不可以加在构造函数中(__init__就是构造函数)。
描述符有三个重要方法: __get__ 、 __set__ 、 __delete__ --- 注意:还有个__del__方法,那是析构函数。

描述符的优先级:
类属性方法 > 数据描述符 > 对象属性方法 > 非数据描述符 > 不存在

数据描述符:描述符类中至少包含__get__和__set__方法中的一个
非数据描述符:描述符类中不包含__set__方法

举个例子,用Typed类描述People的类属性name,描述什么呢?就是对输入的name和age的数据类型做个判断。

class Typed:
    def __init__(self,key,owner_type):
        self.key=key
        self.owner_type=owner_type
    def __get__(self, instance, owner):
        return instance.__dict__[self.key]
    def __set__(self, instance, value):
        if not isinstance(value,self.owner_type):
            raise TypeError('%s输入的类型不是%s' %(self.key,self.owner_type))
        instance.__dict__[self.key]=value
    def __delete__(self, instance):
        return instance.__dict__.pop(self.key)

class People:
    name=Typed('name',str)
    age=Typed('age',int)
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender

p = People('jack',20,'男')
print(p.name)
print(p.__dict__)
del p.name
print(p.__dict__)

输出结果:
D:\python\python.exe D:/software/project/描述符.py
jack
{'name': 'jack', 'age': 20, 'gender': '男'}
{'age': 20, 'gender': '男'}

Process finished with exit code 0

特别说明:描述符一般用不到,有的人工作好多年可能都用不到描述符,这是个很高端的东西,一般用在写大型框架上面,架构师的水平才会用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值