描述符
class Foo: def __get__(self, instance, owner): print('===>get方法') def __set__(self, instance, value): print('===>set方法',instance,value) instance.__dict__['x']=value #b1.__dict__ def __delete__(self, instance): print('===>delete方法') class Bar: x=Foo() #在何地? def __init__(self,n): self.x=n #b1.x=10 b1=Bar(10) print(b1.__dict__) b1.x=11111111111111111 print(b1.__dict__) b1.y=11111111111111111111111111111111111111 print(b1.__dict__) # print(Bar.__dict__) #在何时? # b1=Bar() # b1.x # # b1.x=1 # # del b1.x # print(b1.x) # # b1.x=1 # print(b1.__dict__) # # del b1.x
描述符优先级
# class Foo: # def __get__(self, instance, owner): # print('===>get方法') # def __set__(self, instance, value): # print('===>set方法',instance,value) # # instance.__dict__['x']=value #b1.__dict__ # def __delete__(self, instance): # print('===>delete方法') # # # class Bar: # x=Foo() #在何地? # print(Bar.x) # Bar.x=1 # print(Bar.__dict__) # print(Bar.x) # print(Bar.__dict__) # b1=Bar() # b1.x #get # b1.x=1 # set # del b1.x # delete # b1=Bar() # Bar.x=111111111111111111111111111111111111111 # b1.x # # del Bar.x # b1.x class Foo: def __get__(self, instance, owner): print('===>get方法') # def __delete__(self, instance): # print('===>delete方法') class Bar: x=Foo() #在何地? def __getattr__(self, item): print('----->') b1=Bar() b1.x=1 print(b1.__dict__) b1.xxxxxxxxxxxxxxxxxxxxxxx
描述符的应用:
可以在实例化设值的时候 加入逻辑判断,如判断数据类型是否合法
# def test(x): # print('===>',x) # # test('alex') # test(111111) class Typed: def __init__(self,key,expected_type): self.key=key self.expected_type=expected_type def __get__(self, instance, owner): print('get方法') # print('instance参数【%s】' %instance) # print('owner参数【%s】' %owner) return instance.__dict__[self.key] def __set__(self, instance, value): print('set方法') # print('instance参数【%s】' % instance) # print('value参数【%s】' % value) # print('====>',self) if not isinstance(value,self.expected_type): # print('你传入的类型不是字符串,错误') # return raise TypeError('%s 传入的类型不是%s' %(self.key,self.expected_type)) instance.__dict__[self.key]=value def __delete__(self, instance): print('delete方法') # print('instance参数【%s】' % instance) instance.__dict__.pop(self.key) class People: name=Typed('name',str) #t1.__set__() self.__set__() age=Typed('age',int) #t1.__set__() self.__set__() def __init__(self,name,age,salary): self.name=name self.age=age self.salary=salary # p1=People('alex','13',13.3) p1=People(213,13,13.3) # p1=People('alex',13,13.3) # print(p1.__dict__) # p1=People(213,13,13.3) # print(p1.__dict__) # print(p1.__dict__) # print(p1.name) # print(p1.__dict__) # p1.name='egon' # print(p1.__dict__) # print(p1.__dict__) # del p1.name # print(p1.__dict__) # print(p1) # print(p1.name) # p1.name='egon' # print(p1.name) # print(p1.__dict__)