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

什么是描述符,故名思义就是用来描述一个对象的。你记住一个概念,在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

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

posted @ 2024-08-05 10:52  疯狂Python  阅读(33)  评论(0)    收藏  举报