python描述器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python描述器相关的知识,希望对你有一定的参考价值。
class Int:
def __init__(self, name):
self.name = name
self.data = {}
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描述器的主要内容,如果未能解决你的问题,请参考以下文章