Python 装饰器

定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数
优点:在不更改原函数的前提下,给函数拓展新的功能
语法:@
#1.装饰器的原型
def kuozhan(func):
    def newfunc():
        print('蓬头垢面')
        func()
        print('容光焕发')
    return newfunc

@kuozhan
def func():
    print('我是一名学生')
func()
# func=kuozhan(func)
# func()

#2.装饰器的嵌套
def kuozhan1(func):
    def newfunc():
        print('蓬头垢面1')
        func()
        print('酒足饭饱2')
    return newfunc

def kuozhan2(func):
    def newfunc():
        print('洗洗手3')
        func()
        print('簌簌口4')
    return newfunc

@kuozhan2
@kuozhan1
def func():
    print("我是一个学生")

func()
#输出结果:3124
#4.用装饰器装饰带有参数返回值的函数
def kuozhan(func):
    def newfunc(*args,**kwargs):
        print('萎靡不正')
        func(*args,**kwargs)
        print('精神抖擞')
    return newfunc

@kuozhan
def func(*args,**kwargs):
    dic={'wky':'小吴','wf':'小王'}
    strvar=""
    for i in args:
        strvar +=i + " "
    print('运动地点:'+strvar)

    lst=[]
    for k,v in kwargs:
        if k in dic:
            res=dic[k] + '留下了' + v + '黄金'
            lst.append(res)
    return lst

res=func('操场','草坪',wky='15克',wf='15千克')
print(res)



##5.用类装饰器装饰原函数
class kuozhan():
    #原函数被func这个形参接收到了
    def __call__(self,func):
        #调用一下kuozhan2函数,返回newfunc新函数
        return self.kuozhan2(func)

    def kuozhan1(func):
        def newfunc():
            print('干净整洁')
            func()
            print('臭气雪天')
        return newfunc

    def kuozhan2(func):
        def newfunc():
            print('人模狗样')
            func()
            print('原形毕露')
        return newfunc

##方法一
@kuozhan.kuozhan1
def func():
    print('我是一名学生')
func()

##方法二
@kuozhan()    ##把对象当成函数使用,触发__call__方法
def func():
    print('我是一名学生')
func()

##6用带有参数的装饰器修饰原函数
def outer(n):
    def kuozhan(func):
        def newfunc1(self):
            print('饥肠辘辘1')
            func(self)
            print('呕吐不止1')

        def newfunc2(self):
            print('饥肠辘辘2')
            func(self)
            print('呕吐不止2')

        if n==1:
            return newfunc1
        elif n==2:
            return newfunc2
        elif n==3:
            return 5400
    return kuozhan

class MyClass():
    @outer(1)
    def func1(self):
        print('文明一大步')

    @outer(2)
    def func2(self):
        print('市级文明')

    @outer(3)
    def func3(self):
        print('人类文明')

obj=MyClass()
#扩展原函数新功能
obj.func1()
obj.func2()
#把方法变成属性
print(obj.func3)


##7.用带有参数的类装饰器装饰原函数
'''
如果参数是1,就为当前这个类添加成员属性和方法
如果参数是2,就把当前这个类中的run方法变成属性
'''
class Kuozhan():
    ad='无锡'
    def __init__(self,num):
        self.num=num

    def money(self):
        print('江苏')

    def __call__(self, cls):
        if self.num==1:
            return self.kuozhan1(cls)
        elif self.num==2:
            return self.kuozhan2(cls)

    def kuozhan1(self,cls):
        def newfunc():
            cls.ad=Kuozhan.ad
            cls.money=Kuozhan.money
            return cls()

    def kuozhan2(self,cls):
        def newfunc():
            if 'run' in cls.__dict__:
                cls.run=cls.run()
                return cls()
        return newfunc

#功能一
@Kuozhan(1)
class MyClass():
    def run():
        return  '世界'

obj=MyClass()
print(obj.ad)
obj.money()


##功能二
@Kuozhan(2)
class MyClass():
    def run():
        print('世界')

obj=MyClass()
print(obj.run)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值