python 装饰器

#############################总结#########################################

函数名的应用:

    1,直接打印函数名得到的是函数的内存地址。

    2,函数名可以赋值运算

    3,函数名可以作为函数的参数

    4,函数名可以当做函数的返回值

装饰器:

python 里面的动态代理

存在的意义:在不破坏原有函数的基础上,给函数添加新的功能

def wrapper(fn):
def inner(*args,**kwargs): #为目标函数传参
'''在执行目标之前'''
ret=fn(*args,**kwargs)#调用目标函数,ret是目标函数的返回值
'''在执行目标之后'''
return ret #把目标函数返回值返回,保证函数正常的结束
return inner
@wrapper #target_fun=wrapper(target_func)
def target_func():
pass
target_func()
注意:return用法 
1.函数遇到return时函数体结束
2.如果return后面跟上函数名则返回函数名在内存中的id
3.如果return后面跟上其他字符则返回其本身
###########################################################################
def wrapper(fn):
def inner(*args, **kwargs):
print("准备点钱")
ret = fn(*args, **kwargs)#这里不ret接收 得不到函数的返回值
return ret
return inner
#
@wrapper
def yue(tools):
print("使用%s约一约" % tools)
return "chengle"


ret = yue('momo')
print(ret)

准备点钱
使用momo约一约
chengle

login_name = ""
flag = False

def login_verify(fn):
    def inner(*args, **kwargs):#可以理解成函数的形参
        while 1:
            if flag == True:
                ret = fn(*args, **kwargs)#可以理解成函数的实参
                return ret
            else:
                print("您还没有登录. 请登录!")
                login()
    return inner

def login():
    print("=============欢迎进入登录环节================")
    while 1:
        uname = input('请输入你的用户名:')
        upwd = input('请输入你的密码:')

        f = open('register', mode="r", encoding="utf-8")
        for line in f:
            d = eval(line.strip())
            if uname == d['username'] and upwd == d["password"]:
                global login_name
                global flag
                login_name = uname # 保存登录的用户名
                flag = True
                print("=============登录成功!!!!!================")
                f.close()
                return
        else:
            f.close() # 关文件
            y = input("=============用户名或密码错误,是否重新登录(Y/N)!!!!!================")
            if y.upper() != "Y":
                return

@login_verify
  def article():

  pass

 

 #################################作业题##################################

2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码

def func1(f):
def inner():
print('每次执行前都经过这里')
retun inner
@func1
def func2():
print('hello world')
func2()

4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.

def func2(f):
def innter():
a=1
while a<=3:
username=input('请输入用户名:')
password=input('请输入密码')
if username=='alex' and password=='123456':
f()
break
else:
print('账号错误,还剩下%s次机会' %(3-a))
a+=1
continue
return innter
@func2
def func1():
print('登陆成功')
func1()

5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),
  要求登录成功一次,后续的函数都无需再输入用户名和密码

dic = {
    'name':None,
    'status' : False
}

def func1(f):
    def inner(*args,**kwargs):
        num = 0
        while num < 3:
            if dic['status']:
                ret = f(*args,**kwargs)
                return ret
            else:
                username = input('请输入用户名')
                password = input('请输入密码')
                f1 = open('test.txt',encoding='utf-8')
                for i in f1:
                    new_list = i.strip().split()
                    if username == new_list[0] and password == new_list[1]:
                        dic['status'] = True
                        break
                else:
                    num += 1
                    print('输入用户名或密码错误还有{}次机会'.format(3-num))
                    continue
    return inner


@func1# func4=func1(func4)
def func4():
    print('登录成功')

func4()

6,给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))

import time
def wapper(f):
    def inner(*args,**kwargs):
        struct_time = time.localtime()
        time_log = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
        f1 = open('log1.txt',encoding='utf-8',mode='a')
        f1.write(time_log+'	')
        f1.write(str(f)+'
')
        f(*args,**kwargs)
    return inner

@wapper
def func1(*args,**kwargs):
    print('hello world')


func1('aa','bbb')
import time

def logger(fn):
    def inner(*args, **kwargs):
        # fn.__name__ # 函数名字
        f = open("log", mode="a", encoding="utf-8")
        f.write("在%s, 访问了%s函数
" % (time.strftime("%Y-%m-%d %H:%M:%S"), fn.__name__))
        ret = fn(*args, **kwargs)
        return ret
    return inner


@logger
def chi():
    print("wusir特别能吃")
@logger
def he():
    print("太白特别能和")
@logger
def shui():
    print("太黑特别能睡")

chi()
chi()
he()
chi()
shui()
shui()
不怕大牛比自己牛,就怕大牛比自己更努力
原文地址:https://www.cnblogs.com/zaizai1573/p/10121431.html