问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python装饰器应该怎么理解?

发布网友 发布时间:2022-05-10 06:24

我来回答

3个回答

懂视网 时间:2022-05-10 10:46

b、返回值中包含函数名

[对装饰器的影响]:达到“不改变函数的调用方式“的效果

import time
def bar():
 time.sleep(3)
 print('in the bar')
def test2(func):
 print('新添加的功能')
 return func
bar=test2(bar)
bar()

运行结果:

新添加的功能
in the bar

(3) 嵌套函数:在一个函数体内用def去声明一个新的函数(不是调用)

def foo():
 print('in the foo')
 def bar(): #声明一个新的函数,而不是调用函数
 print('in the bar')
 bar()
foo()

运行结果:

in the foo
in the bar

4、装饰器的语法:高阶函数+嵌套函数=》装饰器 (下面的例子可以用pycharm的调试器调试一下,看看代码的运行顺序)

import time
def timer(func):
 def deco(*args,**kwargs):#使用了不定参数
 start_time=time.time()
 res=func(*args,**kwargs) #运行函数
 stop_time=time.time()
 print('运行时间:',stop_time-start_time)
 return res # 若无返回值,则返回None
 return deco
@timer #等价于test1=timer(test1)=deco,即test1()=deco()
def test1():
 time.sleep(3)
 print('in the test1')
@timer #等价于test2=timer(test2)=deco,即test2(name)=deco(name)
def test2(name):
 time.sleep(3)
 print('in the test2',name)
test1()
print('-------------分界线------------------------')
test2('Tomwenxing')

运行结果:

in the test1
运行时间: 3.0001718997955322
-------------分界线------------------------
in the test2 Tomwenxing
运行时间: 3.000171422958374

5、带参数的装饰器

# -*- coding:utf-8 -*-
user,passwd='Tomwenxing','123'
#如装饰器带参数,一般是三层嵌套
def auth(auth_type): #第一层的参数是装饰器的参数
 def outer_wrapper(func):#第二层的参数是装饰器要装饰的目标函数
 def wrapper(*args,**kwargs):#第三次的参数是目标函数的参数
 if auth_type=='local':
 username = input('Username:').strip()
 password = input('Password:').strip()
 if user == username and passwd == password:
  print('用户Tomwenxing已经成功登录!')
  res = func(*args, **kwargs) #运行目标函数
  return res
 else:
  exit('用户名或密码有错误')
 elif auth_type=='ldap':
 print('暂不支持这种登录方式!')
 return wrapper
 return outer_wrapper
def index():
 print('欢迎来到index页面')
@auth(auth_type='local') #home=wrapper()
def home(name):
 print('%s,欢迎来到home页面' %name)
 return 'This is home page'
@auth(auth_type='ldap')
def bbs():
 print('欢迎来到bbs页面 ')
index()
print('----------------------分界线-------------------')
print('函数的返回值为:',home('wenxing'))
print('----------------------分界线-------------------')
bbs()

运行结果:

欢迎来到index页面
----------------------分界线-------------------
Username:Tomwenxing
Password:123
用户Tomwenxing已经成功登录!
wenxing,欢迎来到home页面
函数的返回值为: This is home page
----------------------分界线-------------------
暂不支持这种登录方式!

热心网友 时间:2022-05-10 07:54

所谓装饰器就是把函数包装一下,为函数添加一些附加功能,装饰器就是一个函数,参数为被包装的函数,返回包装后的函数:你可以试下:

def d(fp):
    def _d(*arg, **karg):
        print "do sth before fp.."
        r= fp(*arg, **karg)
        print "do sth after fp.."
        return r
    return _d

@d
def f():
    print "call f"
#上面使用@d来表示装饰器和下面是一个意思
#f = d(f)


f()#调用f

追问如果装饰器和被装饰的函数还有其他参数呢?

追答

装饰器带参数:再包装一层

被装饰的函数还有其他参数:上面的例子包装函数就是接收任意形式的参数

# -*- coding: cp936 -*-
def d(a):
    def _d(fp): 
        def __d(*arg, **karg):
            print a
            print "do sth before fp.." 
            r= fp(*arg, **karg) 
            print "do sth after fp.." 
            return r 
        return __d
    return _d
  
@d("haha")
def f(): 
    print "call f"
@d("hehe")
def f2(a, b=2):
    print "call f2"
    print a+b
f()
print "-"*20
f2(1)
print "-"*20
f2(a=1,b=4)

热心网友 时间:2022-05-10 09:12

有点像复合函数
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
镇海立人中学好吗 镇海立人中学升学率 自考学位申请在什么时候 电子科大自考本科申请学士学位要多久 浙江自考毕业两年后还能考学士学位吗 自考学士学位申请超过时限怎么办 自考本科毕业后多久能申请学士学位 自考本科毕业后多久能申请学位 自考要在几年内考完才能申请学位证 春天可以种白菜吗 春天能不能种白菜 怎样炒黄豆即酥又不糊 想开个河豚 的饭店需要什么手续 哪里可以买到河豚毒素(Tetrodotoxin/TTX)?实验急需! 今年上海嘉定何处吃河豚、刀鱼? 上海哪有买河豚鱼啊? 上海哪家饭店有吃河豚鱼?要干净点的! 河豚 上海 请问上海开饭店可以卖河豚鱼吗 上海哪里可以吃到河豚? 黑椒牛仔骨怎么做?如题 谢谢了 河豚虽是有毒,但不也一样有人吃 上海有河豚鱼吃吗? 黑椒牛仔骨怎样做的入味好吃呢? 上海河豚网络科技有限公司怎么样? 上海有人贩卖活河豚,数量明显超出立案标准,但是食品局没有报案,而是罚款100万,是不是违规了? 狗狗假孕是什么原因? 狗狗卵巢囊肿怎么治疗? 泰迪狗狗摘除子宫卵巢和做绝育一样吗? 狗狗的子宫和卵巢是黑色的吗 冬笋炝黄豆芽怎样做好吃呢? 怎么评价小说《大主宰》? 网友评价大主宰不留情面,真的这么差吗? 大主宰这部剧后期会有逆转吗? 广式蒸鲳鱼怎么做 大主宰评分低到底是谁的演技不好? 你如何评价天蚕土豆的《大主宰》? 广式蒸鲳鱼的做法步骤图,广式蒸鲳鱼怎么做好吃 王源新剧《大主宰》终于定档,他能超越千玺吗? 大主宰好看?还是斗破苍穹好看? 广式蒸鱼的介绍 长方脸适合什么发型男生 广式蒸黄鱼怎么做 男生长方形脸留什么发型 天蚕土豆大主宰后下一本书 长方脸的男生留什么发型比较适合? 长方形脸型的男的适合什么发型 《大主宰》中有哪些有趣的细节? 戴尔笔记本D620摄像头驱动怎么下载 要求:请从个人读大学角度论述大学投资成本与收益(1500字) 1.分析大学生4年学 想要会计专业的毕业论文范文