0基础学Python(6) —— 关于装饰器

来源:互联网 发布:win7系统数据恢复 编辑:程序博客网 时间:2024/06/03 22:42
#第一步:基本函数
def cat():
    print('小猫咪喵喵喵')
cat()


#第二步:扩展功能(不能直接修改原来的函数)
def zhuangshi():
    print('干净的小白白')
    cat()
    print('他的好朋友是小花花')
def cat():
    print('小猫咪喵喵喵')
cat = zhuangshi()


#第三部:实现基本装饰功能
def zhuangshi(func):
    def inner():
        print('干净的小白白')
        func()
        print('他的好朋友是小花花')
    return inner
def cat():
    print('小猫咪喵喵喵')
cat = zhuangshi(cat)
cat()


#第四步:语法糖方式实现函数
def zhuangshi(func):
    def inner():
        print('干净的小白白')
        func()
        print('他的好朋友是小花花')
    return inner
@zhuangshi
def cat():
    print('小猫咪喵喵喵')
cat()


#第五步:带有参数的函数的装饰器
def zhuangshi(func):
    def inner(who,where):
        print('干净的小白白')
        var = func(who,where)
        print('他的好朋友是小花花')
        return var
    return inner
@zhuangshi
def cat(who,where):
    print('小猫咪跟'+ who + '在' + where + '一起喵喵喵')
    return '小花花学不会喵喵喵'
res = cat('小花花','厨房')
print(res)


#第六步:带有收集参数的函数的装饰器
def zhuangshi(func):
    def inner(*who,**where):
        print('干净的小白白')
        var = func(*who,**where)
        print('他的好朋友是小花花')
        return var
    return inner
@zhuangshi
def cat(*who,**where):
    print('小猫咪跟',who,'在',where,'一起喵喵喵')
    return '小花花学不会喵喵喵'
res = cat('小花花','小黑黑',cf = '厨房',ct = '餐厅')
print(res)


#第七步:带有参数的装饰器
def outer(arg):
    def zhuangshi(func):
       def inner():
           if arg == '小花花':
               print('小白白和小花花一起玩皮球')
           elif arg == '小黑黑':
               print('小黑黑是别人家的小狗')
           var = func()
           if arg == '小花花':
               print('小白白累的时候就倚着小花花睡觉')
           elif arg == '小黑黑':
               print('只有周末才能和小黑黑一起玩')
           return var
       return inner
    return zhuangshi
@outer('小花花')
def cat():
    print('小白白的好朋友是小狗小花花')
    return '小花花从来不欺负小白白'
res = cat()
print(res)


#第八步:使用类作为装饰器的参数
class Cat:
    def xcat():
        print('小白白是最可爱的小猫咪')
    def dcat():
        print('小白白会长成可爱的大猫咪')
class Dog:
    def xdog():
        print('小花花也是最可爱的小猫咪')
    def ddog():
        print('小花花现在就已经很大了')
def outer(arg):
    def zhuangshi(func):
        def inner():
            if arg == Cat:
                arg.xcat()
            elif arg == Dog:
                arg.xdog()
            var = func()
            if arg == Cat:
                arg.dcat()
            elif arg == Dog:
                arg.ddog()
            return var
        return inner
    return zhuangshi


@outer(Cat)
def cat():
    print('小白白的好朋友是小狗小花花')
    return '小花花从来不欺负小白白'
res = cat()
print(res)


#第九步:使用类作为装饰器
class Cat:
    def __init__(self,arg):
        #print(arg)
        self.abc = arg
    def __call__(self,val):
        #print(val)
        self.func = val
        return self.inner
    def inner(self):
        print('小白白动不动的就撒娇')
        self.func()
        print('小花花特别宠溺小白白')
        #return self.func
@Cat('hao')
def cat():
    print('小白白的好朋友是小狗小花花')
cat()


#第十步:为类添加装饰器
def zhuangshi(arg):
    def inner():
        print('干净的小白白')
        print('他的好朋友是小花花')
        return arg()
    return inner
@zhuangshi
class Cat:
    print('小白白的好朋友是小狗小花花')
Cat()


#第十一步:装饰器的嵌套
def zhuangshi1(func):
    def inner():
        print('干净的小白白')
        func()
        print('他们永远都是好朋友')
    return inner
def zhuangshi2(func):
    def inner():
        print('可爱的小花花')
        func()
        print('他们俩个喜欢一起玩耍')
    return inner
@zhuangshi1
@zhuangshi2
def cat():

    print('小白白的好朋友是小狗小花花')


Python学习交流、资源共享群:563626388 QQ


原创粉丝点击