ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)

2019-06-25 20:41:43  阅读:199  来源: 互联网

标签:return 函数 inner1 Python print 执行 装饰 def 进阶


Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)

一丶带参数的装饰器

def wrapper_out(pt):

    def wrapper(func):
        def inner(*args,**kwargs):

            useinput = input('请输入用户名:>>').strip()
            password = input('请输入密码:>>').strip()
            with open(pt,encoding='utf-8') as f:
                for line in f:
                    us,pwd=line.strip().split('|')
                    if useinput==us and password ==pwd:
                        print(f'登录{pt}成功')
                        ret=func()
                        return ret
                return False
        return inner

    return wrapper

@wrapper_out('qq')
def QQ():
    print('welcome QQ')

@wrapper_out('dy')
def Dy():
    print('welcome Dy')


QQ()
Dy()


### 看到带参数的装饰器分两步执行:
#开发思路:增强耦合性
#     @wrapper_out('qq')
#     1. 执行wrapper_out('qq') 这个函数,把相应的参数'qq' 传给 pt,并且得到返回值 wrapper函数名。
#     2. 将@与wrapper结合,得到我们之前熟悉的标准版的装饰器按照装饰器的执行流程执行。

二丶多个装饰器装饰一个函数

def wrapper1(func1):
    def inner1():
        print('w1 ,before')
        func1()
        print('w1 after')
    return inner1

def wrapper2(func2):
    def inner2():
        print('w2 ,before')
        func2()
        print('w2 after')
    return inner2

@wrapper2   #  f =wrapper2(f) , func2=inner1函数 当执行完func2时, 就带表要去执行inner1,  func1() 执行的是真正的原函数.
@wrapper1   #  f =wrapper1(f) , func1=f原函数   f()=inner1
def f():
    print('in f')

f()        # f在这里 被我定义 变量,看下面理解,就ok了.



#### 推荐一种方式 ,debug模式.     
# 多个装饰器装饰一个函数相当于装饰器函数的嵌套  (相当于把另一个装饰器函数的inner方法作为参数传递给了另一个装饰器函数的形参func接收.) so不明白就看下面吧

标签:return,函数,inner1,Python,print,执行,装饰,def,进阶
来源: https://www.cnblogs.com/dengl/p/11085426.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有