码迷,mamicode.com
首页 > 编程语言 > 详细

python描述器

时间:2017-04-14 12:00:51      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:main   表示   object   orm   类变量   xxx   dict   mat   nbsp   

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描述器

标签:main   表示   object   orm   类变量   xxx   dict   mat   nbsp   

原文地址:http://www.cnblogs.com/harden13/p/6707934.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!