首页 > 代码库 > python描述器

python描述器

class Int:
def __init__(self, name):
self.name = name
self.data = http://www.mamicode.com/{}

def __get__(self, instance, cls):
print(‘get {}‘.format(self.name))
if instance is not None:
return self.data[instance]
return self

def __set__(self, instance, value):
self.data[instance] = value

def __str__(self):
return ‘Int‘

def __repr__(self):
return ‘Int‘


class A:
val = Int(‘val‘)

def __init__(self):
self.val = 3
a=A()
print(a.val)
a.val ## 当一个类变量 实现了 __get__ 和 __set__ 方法之后, 访问这个类变量会调用__get__ 方法, 对这个类变量赋值会调用__set__ 方法 这种类变量就叫做描述器

描述器会提升优先级到__dict__ 之前
带 __set__方法的描述器会提升优先级到__dict__之前
class Int:
def __get__(self, instance, cls):
return 3

def __set__(self, instance, value):
pass
class A:
val = Int()
xxx = Int()

def __init__(self):
self.__dict__[‘val‘] = 5
A().val
A().__dict__
描述器,事实上是一种代理机制
当一个类变量被定义为描述器,对这个类变量的操作将由此描述器代理
当一个描述器实现了__set__或__delete__方法, 优先级会被提升到__dict__之前


__get__(self, instance, cls) instance 表示当前实例 cls 表示类本身, 使用类访问的时候, instance为None
__set__(self, instance, value) instance 表示当前实例, value 右值, 只有实例才会调用 __set__
__delete__(self, instance) instance 表示当前实例
class Desc:
def __get__(self, instance, cls):
print(instance)
print(cls)
return ‘x‘

def __set__(self, instance, value): #value是赋值的值
print(instance)
print(value)

def __delete__(self, instance):
print(instance)
class A:
x = Desc()

A().x #实例访问
<__main__.A object at 0x7f4a84767208>
<class ‘__main__.A‘>
Out[47]:
‘x‘

A.x #类访问

 

python描述器