用类作为装饰器装饰函数!

在python中我们可以利用一个函数作为装饰器来装饰另一个函数,但是装饰器只能是函数吗 ?当然了我们还可以使用类来作为装饰器!

class A(object):
    def __init__(self,func):
        print(‘定义初始化函数‘)
        print(‘func name is %s‘%func.__name__)
        self.__func = func

    def __call__(self):
        print(‘call 方法作为装起中的功能‘)
        self.__func()
        print(‘增加的功能2‘)

# @A

def B():
    print(‘这个是B是原函数‘)

# A(B)
#如果不看装饰器的作用的话,这里的 A(B)和上面的 @A相等作用相同,但是这里的作用就是是装饰器了,就只是简单的函数调用了,所以就不会调用call方法了

这个的输出结果是:

定义初始化函数
func name is B

注意:
这里的为什么会打印出B而不是A,我简单的解释下,
我们把A当做装饰器调用,也就相当于调用了A这个类A(B)
这样的话我们就传入了参数B这个函数,所以func.name这个就是B了
这里初始化的调用就完成了

class A(object):
    def __init__(self,func):
        print(‘定义初始化函数‘)
        print(‘func name is %s‘%func.__name__)
        self.__func = func

    def __call__(self):
        print(‘call 方法作为装起中的功能‘)
        self.__func()
        print(‘增加的功能2‘)

@A

def B():
    print(‘这个是B是原函数‘)

# A(B)
B()

这个的输出结果是:

定义初始化函数
func name is B
call 方法作为装起中的功能
这个是B是原函数
增加的功能2

注:
这里我们把类当做装饰器了,所以他就会去调用call方法,也就自然会调用下面的方法了!

原文地址:http://blog.51cto.com/853056088/2159162

时间: 2024-08-30 05:18:06

用类作为装饰器装饰函数!的相关文章

22_装饰器、带参数的装饰器、多个装饰器装饰一个函数

一.装饰器的执行流程 1 def wrapper(func): 2 def inner(*args,**kwargs): 3 ret = func(*args,**kwargs) 4 return ret 5 return inner 6 7 @wrapper #fun = wrapper(fun) 8 def fun(s): 9 print('666') 10 return s 11 12 fun('777') 13 print(fun('777')) 14 15 ''' 16 1.程序至上而

关于Python装饰器内层函数为什么要return目标函数的一些个人见解

https://blog.csdn.net/try_test_python/article/details/80802199 前几天在学装饰器的时候,关于装饰器内层函数调用目标函数时是否return目标函数的调用产生了一点迷惑,事实是当被装饰的目标函数有返回值的时候,装饰器内层函数也必须返回该目标函数的调用. 我们都知道不带括号的函数名指向是函数代码所在的内存地址,加上括号之后就变成了一个执行命令,那么这个'func( )'到底有什么意义呢? 上面这张图可以大概看出点东西,单独的函数名是 fun

day14 带函数的装饰器、多个装饰器装饰一个函数

一.带参数的装饰器:------开关 __author__ = 'Administrator' F=True def outer(F): def wap(fun):#gg def inner(*args,**kwargs): if F: print("inner before") ret=fun(*args,**kwargs)#gg() print("inner after") else: ret=fun(*args,**kwargs) return ret ret

python-day14--带参数的装饰器+多个装饰器装饰同一个函数

1.# 带参数的装饰器def f1(flag): def f2(func): def inner(*args,**kwargs): if flag: '''执行函数之前要做的''' r=func(*args,**kwargs) if flag: '''执行函数之后要做的''' return r return inner return f2@f1(True)def f3(): print('egon') return ('eva')s=f3()print(s) 2.#多个装饰器装饰一个函数 def

Python----多个装饰器装饰一个函数

#装饰器回顾: # def wrapper(f): #f= func1# def inner(*args,**kwargs):# print(333) #1. 333# ret=f(*args,**kwargs)# print(666)# return ret# return inner# @wrapper # func1=wrapper(func1)=inner# def func1(): # inner() 定义函数,将函数加载到内存中,但是不执行,等待被调用# print(111) #2.

带参数的装饰器,多个装饰器装饰一个函数,函数的有用信息。

带参数的装饰器.import time def timer_out(flag1): #falg1 = flag def timer(f): def inner(*args, **kwargs): if flag1: start_time = time.time() time.sleep(0.3) ret = f(*args, **kwargs) end_time = time.time() print('执行效率%s' % (end_time-start_time)) return ret el

Python全栈__函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数

1.函数的有用信息 代码1: 1 def login(username, password): 2 """ 3 此函数需要用户名,密码两个参数,完成的是登录的功能. 4 :return: True 登录成功. False登录失败. 5 """ 6 print(login.__name__) 7 print(login.__doc__) 8 print('登录成功...') 9 return True 10 11 print(login.__nam

关于多个装饰器装饰一个函数执行顺序的问题

我们通过两个实例来解开我们的疑惑: 实例一: def war1(func): def inner(*args, **kwargs): print("======war1 start=====") func(*args, **kwargs) print("======war1 end=====") return inner def war2(func): def inner(*args,**kwargs): print("======war2 start==

多个装饰器装饰一个函数

#!/usr/bin/env python # -*- coding:utf-8 -*- # 作者: Apollo # 邮箱: [email protected] # 博客: http://www.zgerji.online/ def wrapper1(func): # func = f def inner1(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner1 def wrapp

diango中让装了装饰器的函数的名字不是inner,而是原来的名字

让装了装饰器的函数的名字不是inner,而是原来的名字 from functools import wraps def wrapper(func): @wraps(func) # 复制了原来函数的名字和注释 def inner(request,*arg,**kwargs): # 之前 ret = func(request,*arg,**kwargs) # 之后 return ret return inner @wrapper # f1 = wrapper(f1) def f1(request):