博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0515Python基础-带参数的装饰器-多个装饰器
阅读量:7110 次
发布时间:2019-06-28

本文共 2351 字,大约阅读时间需要 7 分钟。

1、函数的有用信息。

def login(username, password):

    """

    此函数需要用户名,密码两个参数,完成的是登录的功能。

    :return: True 登录成功。 False登录失败。

    """

    # print(login.__name__)

    # print(login.__doc__)

    print('登录成功...')

    return True

 

print(login.__name__)

print(login.__doc__)

 

 

def wrapper(f):

    def inner(*args, **kwargs):

        print(f.__name__)

        print(f.__doc__)

        """执行函数之前的操作"""

        ret = f(*args, **kwargs)

        """执行函数之后的操作"""

        return ret

    return inner

 

@wrapper

def login(username, password):

    """

    此函数需要用户名,密码两个参数,完成的是登录的功能。

    :return: True 登录成功。 False登录失败。

    """

    print('登录成功...')

    return True

 

# print(login.__name__)

# print(login.__doc__)

login(1, 2)

 

 

from functools import wraps

 

def wrapper(f):

    @wraps(f)

    def inner(*args, **kwargs):

        """执行函数之前的操作"""

        ret = f(*args, **kwargs)

        """执行函数之后的操作"""

        return ret

    return inner

 

@wrapper

def login(username, password):

    """

    此函数需要用户名,密码两个参数,完成的是登录的功能。

    :return: True 登录成功。 False登录失败。

    """

    a = 2

    c = 4

    print('登录成功...')

    return True

 

print(login.__name__)

print(login.__doc__)

for i in login.__dict__:

    print(i)

print(dir(login))

 

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

            else:

                ret = f(*args, **kwargs)

                return ret

        return inner

    return timer

 

flag = False

 

@timer_out(flag)  # 1,步 timer_out(flag) == timer 2,@与timer结合,变成你熟悉的装饰器 @timer

def func1():

    print(111)

 

 

@timer_out(flag)

def func2():

    print(222)

 

 

@timer_out(flag)

def func3():

    print(333)

 

func1()

func2()

func3()

 

 

count = 1

 

def func4():

    count = count + 1

    print(count)

 

func4()

局部只能引用全局的变量,不能修改,如果要修改,global。

 

def func4():

 

    count = 3

    def inner():

        nonlocal count

        count = count + 1

        print(count)

func4()

子函数只能引用父函数的变量,不能修改,如果要修改,nonlocal。

 

3、多个装饰器装饰一个函数。

def wrapper1(func): # func = f函数名

    def inner1():

        print('wrapper1 ,before func')  # 2

        func()

        print('wrapper1 ,after func')  # 4

    return inner1

 

 

def wrapper2(func):  # func = inner1

    def inner2():

        print('wrapper2 ,before func')  # 1

        func()  # inner1()

        print('wrapper2 ,after func')  # 5

    return inner2

 

@wrapper2  # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2

@wrapper1  # f = wrapper1(f) 里面的f函数名  外面的f新变量=inner1

def f():

    print('in f')  # 3

 

f()  # inner2()

'''

wrapper2 ,before func

wrapper1 ,before func

in f

wrapper1 ,after func

wrapper2 ,after func

'''

转载于:https://www.cnblogs.com/dzh0394/p/9042650.html

你可能感兴趣的文章
.NET Core项目从xproj+project.json向csproj迁移简介
查看>>
Tomcat指定特定JDK版本
查看>>
分离你的spring配置文件,让结构更清晰
查看>>
bzoj 4868: [Shoi2017]期末考试
查看>>
assetBundle打包脚本与LUA
查看>>
Spring的Hello World工程
查看>>
Java 8 新特性
查看>>
WPF 关于圆角的制作
查看>>
MySql(十四):MySql架构设计——可扩展性设计之数据切分
查看>>
Ocelot简易教程(二)之快速开始1
查看>>
思绪:常想一二
查看>>
Flash调用XML文件的方法
查看>>
JSF---->其他标签
查看>>
Add Console Application Program to the MFC Program
查看>>
Oracle中可被并行化执行的SQL操作
查看>>
新的Layout布局系统
查看>>
java链表
查看>>
VC获取操作系统版本和名称
查看>>
禁止复制
查看>>
使用GLSL实现更多数量的局部光照 【转】
查看>>