2018-07-18-Python全栈开发day28-描述符应用与类的装饰器-part2
1.类的装饰器
property的作用:1.改变函数属性的调用方式,不需要加括号。
装饰器的概念:@test--就是a=test(a),装饰器除了给函数使用之外,还可以给类使用
1.1 装饰器举例
对函数进行修饰
def fun(obj): print('===') return obj#obj传入的是个函数 @fun def test(): print('this is a test') test() ==、 === this is a test
对类进行修饰
def fun(obj): print('===') return obj#obj传入的是个函数 @fun class Test: pass Test() == ===
1.2类的装饰器修订
作用:给类添加属性
def fun(**kwargs):#传进来的是一个字典 def deco(obj): for k,y in kwargs.items():#k就是方法,y就是值 setattr(obj,k,y) return obj return deco #Test=fun(Test) @fun(x=1,y=2,c=4) class Test: pass print(Test.__dict__)
1.3 装饰器的高级应用
#作用:根据类实例化是输入的类型来确定是否输入正确 #通过描述符来给类添加属性,而且属性要符合类型 class Fun:#描述符,用来实现设置和get功能 def __init__(self,key,type1): self.key=key self.type1=type1 def __get__(self, instance, owner): return instance.__dict__[self.key] def __set__(self, instance, value): if isinstance(value,self.type1): instance.__dict__[self.key]=value else: print('please input an %s for %s' %(self.type1,self.key)) def __delete__(self, instance): pass def gongneng(**kwargs):#装饰器,用来给类进行修饰 def deco(obj): for k,v in kwargs.items():#k为属性名,v为属性的值 setattr(obj,k,Fun(k,v))#obj.k=Fun(k,v) return obj return deco @gongneng(name=str,age=int,gender=str) class Test:#被修饰的类,用来被添加功能 def __init__(self,name,age,gender): self.name=name self.gender=gender self.age=age#这三个是要被代理的,实例属性的优先级小于数据描述符 p1=Test('alex',18,'alex')
2.自定义property
property的用法
class Fun: def __init__(self): self.price=10 self.number=50 @property def money(self): return self.price*self.number @money.setter def money(self,value): self.price=value @money.deleter def money(self): del self.price p1=Fun() print(p1.money) p1.money=100#赋值的时候调用setter,删除的时候调用deleter print(p1.money)
2.2 自定义property//类也可以当做修饰器,就是进行实例化的过程
#利用描述符来实现property的功能--调用 #类也可以当作修饰器 #Test class Test: def __init__(self,func): self.func=func#fun=area def __get__(self, instance, owner):#p1.name=p1.name()就是完成这个过程 return self.func(instance) # def __set__(self, instance, value): # pass class Room: def __init__(self,length,hight): self.length=length self.hight=hight #在这里实现property #area=Test(area)==可以是函数和类,类就是实例化的过程,会不会是代理呢 ?如果是描述符的话,就是代理了 @Test def area(self): print('this is area') return self.length*self.hight #p1.name=p1.name()#调用get方法,自定义一下, p1=Room(18,15) print(p1.area)#此时需要括号,而且会自动将实例穿进去 # p1.area
                    
                
                
            
        
浙公网安备 33010602011771号