什么是描述符?
官方定义:通常,描述符是具有“绑定行为”的对象属性,其属性访问已被描述符协议中的方法覆盖。这些方法是__get__(),set()和 delete()。如果为对象定义了任何这些方法,则称其为描述符。
简单描述: 首先要有一个实现了__get__;set;__delete__方法的其中一种的类,如果一个类有个属性是前面的类的实例化对象,那么这个属性就是一个描述符。
# 创建类:MyDescriptor
class MyDescriptor:
# 添加 __get__ 方法
def __get__(self, instance, owner):
print('get called')
return 'get'
# 添加 __set__ 方法
def __set__(self, instance, value):
print('set called')
# 添加 __delete__ 方法
def __delete__(self, instance):
print('delete called')
# 创建类:Foo
class Foo:
# 创建一个实例对象调用上面的类 MyDescriptor
attr = MyDescriptor()
描述符的作用?
描述符的作用是用来代理一个类的属性,需要注意的是描述符不能定义在被使用类的构造函数中,只能定义为类的属性,它只属于类的,不属于实例,我们可以通过查看实例和类的字典来确认这一点。
# 创建类:MyDescriptor
class MyDescriptor:
# 添加 __get__ 方法
def __get__(self, instance, owner):
print('get called')
return 'get'
# 添加 __set__ 方法
def __set__(self, instance, value):
print('set called')
# 添加 __delete__ 方法
def __delete__(self, instance):
print('delete called')
# 创建类:Foo
class Foo:
# 创建一个实例对象调用上面的类 MyDescriptor
attr = MyDescriptor()
# 创建对象
f = Foo()
# 调用 attr
f.attr
# 设置attr数据
f.attr = 'python'
# 删除attr数据
del f.attr
描述符案例:限制属性
class Person(object):
def __init__(self, num):
self.num = num
self.dict = {}
def __get__(self, instance, owner):
return self.dict.get(instance)
def __set__(self, instance, value):
if value < 0:
raise ValueError('数据必须大于0')
self.dict[instance] = value
class Student(object):
age = Person(0)
score = Person(0)
def __init__(self, score, age):
self.name = score
self.age = age
s = Student(18, 100)
s.age = 18
s.score = 90
print(s.age)
print(s.score)
描述符案例:描述符完成@classmethod
class A(object):
def __init__(self, item):
self.item = item
def __get__(self, instance, owner):
return self.item
def __set__(self, instance, value):
print(value)
class B(object):
a = A(0)
name = '小明'
@classmethod
def class_l(cls):
print('姓名:', cls.name)
b = B()
b.class_l()