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

 

    

      

posted @ 2018-07-19 00:02  brownbearye  阅读(123)  评论(0)    收藏  举报