初识python: 装饰器

Posted Simple-Sir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识python: 装饰器相关的知识,希望对你有一定的参考价值。

定义:
  
本质是函数,功能是“装饰”其它函数,即为其他函数添加附加功能
原则:
1、不能修改被装饰函数的源代码;
2、不能修改被装饰函数的调用方式
实现装饰器知识储备:
1、函数即“变量”;
2、高阶函数;
3、嵌套函数。

实例1:初始版
# 定义装饰器函数
import time
def qt_fun(func):
    def gj_func(*args,**kwargs): #关键点,定义不定实参传入值个数*args,形参个数**kwargs
        start_time=time.time()
        func(*args,**kwargs) #关键点,传入参数
        stop_time=time.time()
        print(\'运行时间:\',stop_time-start_time)
    return gj_func #关键点,返回值。

@qt_fun #关键点,引用装饰器,相当于:test1 = qt_fun(test1)
def test1(name):
    time.sleep(1)
    print(\'姓名:\',name)

@qt_fun #关键点,引用装饰器,test2 = qt_fun(test2)  test2()
def test2(name,age,addrs):
    time.sleep(2)
    print(\'姓名:%s 年龄:%s 地址:%s\'%(name,age,addrs))


#test1 = qt_fun(test1)
#test1()

#可替换成 @qt_fun  @装饰器名

#调用函数
test1(\'simple\')
test2(\'simple\',26,\'四川\')


实例2:终极版

user_name = \'simple\'
password = \'123\'
def choose_type(c_type):
    def login_f(func):
        def in_fun(*args,**kwargs):
            if c_type == \'A\':
                print(\'当前选择的验证方式为:\', c_type)
                name=input(\'用户名:\').strip()
                passwd=input(\'密码:\').strip()
                if name==user_name and passwd==password:
                    print(\'登录成功!\')
                    func(*args,**kwargs)
                else:
                    exit(\'用户名或密码不正确,登录失败!\')
            elif c_type == \'B\':
                print(\'当前选择的验证方式为:\', c_type)
                print(\'此验证方式,开发中....\')
            else:
                print(\'输入的验证方式不正确!\')
        return in_fun
    return login_f

@choose_type(c_type=input(\'请选择home的验证方式(A/B):\').strip())
def home():
    print(\'欢迎进入主页!\')

@choose_type(c_type=input(\'请选择bbs的验证方式(A/B):\').strip())
def bbs():
    print(\'欢迎进入bbs界面!\')

def index():
    print(\'欢迎光临index界面!此界面无需验证!\')

home()
bbs()
index()

输出结果:

 

以上是关于初识python: 装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python使用上下文对代码片段进行计时,非装饰器

Python之第十八天的努力--装饰器初识

小白成长之路:初识python --python装饰器

python全栈闯关--11-装饰器初识

python之装饰器初识

Python 基础第十一天(闭包和装饰器初识)