什么是描述符,故名思义就是用来描述一个对象的。你记住一个概念,在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
特别说明:描述符一般用不到,有的人工作好多年可能都用不到描述符,这是个很高端的东西,一般用在写大型框架上面,架构师的水平才会用到。
标签:__,优先级,name,self,玩法,描述符,key,age From: https://www.cnblogs.com/kkbest/p/18342197