1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Meta(type):
def __new__(cls,name,base,attr):
if name=='Descriptor':
return type.__new__(cls,name,base,attr)
else:
def dummy(*args):pass
return type.__new__(cls,name,tuple(),dict(\
__module__=attr.get('__module__'),\
val=(attr.get('val') if 'val' in attr else None),\
__get__=(attr.get('get') if 'get' in attr else dummy)\
,__set__=(attr.get('set') if 'set' in attr else dummy)))()
class Descriptor:
__metaclass__=Meta
class Test(object):
class v(Descriptor):
val=56
def get(self,*args):return self.val
def set(self,obj,val):
if type(val)==int: self.val=val
class w(Descriptor):
def get(self,*args): return '$'*Test.v
class x(Descriptor):
val=4
def get(self,obj,objtype):return self.val
def set(self,obj,val):self.val=val%5
class y(Descriptor):
val=60
def get(self,obj,objtype):return self.val
def set(self,obj,val):self.val=val%63
print Test.x,Test.y
Test().y=128
Test().x=6
print Test.x,Test.y,Test.w
print globals() |
Partager