zoukankan      html  css  js  c++  java
  • 函数的装饰器,两层装饰器和三层装饰器

    06.01自我总结

    一.装饰器

    1.函数装饰圈的定义

    函数装饰器:一种装饰函数的函数

    2.个人理解两层函数装饰器

    两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序,但是不能减少他的程序内容,他的原来程序不变只能增不能减少,然后返回装饰好的子函数,再全局定义一个变量名与要装饰的函数名相同名字,并且将装饰后的函数调用赋予改变量.

    1.简单的例子(无参函数)

    #有个函数f1
    def f1():
        print('nick machachong')
    #我们要对齐装饰使其输出打印内容上下都加了'-'线
    def f1_deco(f1):                         #第一步吧变量丢进去
        def wrapper():
            #print(50*'-')                #我们加的内容
            #print('nick machachong')   #这个等同于f1()
            #print(50*'-')                #我们要加的内容
            #这是我们需要的打印效果
            
            pritn(50*'-')
            f1()
            print(50*'-')
        return wrapper  
    
    f1 = f1_deco(f1)             #前面的f1是变量f1,函数本是f1并未发生变化只是一个变量名接受了f1
    f1()
    
    ​```
    --------------------------------------------------
    nick machachong
    --------------------------------------------------
    ​```
    #另外种写法
    @f1_deco
    def f1():
        print('nick machachong')
    f1()
    ​```
    --------------------------------------------------
    nick machachong
    --------------------------------------------------
    ​```
    

    2.关于有参函数

    #如函数
    def sum(x,y):
        print(x+y)
    #我们要对齐装饰使其输出打印内容上下都加了'-'线
    def sum_deco(sum):
        def wrapper(x,y):
            print("-")
            sum(x,y)
         return sum
    sum() = sum_deco(sum)
    sum(x,y)
    
    #多个值
    def sb(x,y,z=2,b=1):
        print(x,y,z,b)
    #把他进行封装
    def sb_deco(sb):
        def wrapper(*args,**kwargs):
            print('nick machachong')
            sb(*args,**kwargs)
        return wrapper
    sb = sb_deco(sb)
    sb(1,23,2,3)
    

    3.对于有返回值的函数式

    #有返回值
    def sb(x,y,z=2,b=1):
        return x,y,z,b
    #对于返回值乘以3
    def sb_deco(sb):
        def wrapper(*args,**kwargs):
            res = sb(*args,**kwargs)
            res = list(res)
            for a in range(len(res)):
                res[a] = 3*res[a]
            res = tuple(res)
            return res
        return wrapper
    sb = sb_deco(sb)
    print(sb(2,3,4,5))
    
    

    4.装饰圈模板

    def sb(*args,**kwargs):
        pass
    #装饰器模板
    def sb_deco(sb):
        def wrapper(*args,**kwargs):
            #sb(*args,**kwargs)   
            res = sb(*args,**kwargs)  #赋值的时候已经开始调用了所有没必要在写一步调用
            return res
       	return wrapper
    sb = sb_deco(sb)
    sb(1,23,2,3,12,312,312,3,123)
    

    3.对于三层装饰器理解

    #比如说一个函数为,我们对齐装饰,打印内容前后上下加'-'
    def sb():
        print('i am sb')
        
    #装饰
    def sb_deco(sb):
        def wrapper():
            print('-'*5)
            sb()
            print('-'*5)
        return wrapper
    #只时候我们加条件要区分是你输入还是我输入的
    
    # 只时候我们加条件要区分是你输入还是我输入的, 我那边聪明肯定不是SB
    def sb_deco(sb):
        def wrapper():
            if user == 'you':
                print('-' * 5)
                sb()
                print('-' * 5)
            elif user == 'i':
                print('-' * 5)
                sb()
                print('这是不可能的')
                print('-' * 5)
        return wrapper
    #这时候我们导入的参数多了个user
    def user(user):
        def sb_deco(sb):
            def wrapper():
                if user == 'you':
                    print('-' * 5)
                    sb()
                    print('-' * 5)
                elif user == 'i':
                    print('-' * 5)
                    sb()
                    print('这是不可能的')
                    print('-' * 5)
            return wrapper
        return sb_deco
    
    
    @user('you')                  #其中@user('you') 相当于a =user('you') sb = a(sb)	
    def sb():																			
        print('i am sb')
    sb()
    #他是对于输入的值的一层装饰,判断他是拿来的
    

    `

  • 相关阅读:
    [Oracle工程师手记]如何收集 RMAN 工作时的 10046 trace
    [Linux]Linux环境,如何查找一个目录下所有包含特定字符串的文件
    [Oracle工程师手记]如何找到 RMAN 的所有 session
    PowerShell提交HTTP Request Post请求
    PowerShell计算字符串MD5 Hash值
    《异类》笔记
    《哈弗商学院 判断与决策心理学课》笔记
    《影响力》笔记
    《金字塔原理》笔记
    三月十九日,偶感
  • 原文地址:https://www.cnblogs.com/pythonywy/p/10960572.html
Copyright © 2011-2022 走看看