1. 程式人生 > >大作業day04

大作業day04

1、整理裝飾器的形成過程,背誦裝飾器的固定格式

固定格式
def wrapper(func): 2.傳入函式值f
    def inner(*args, **kwargs):
        #執行函式前進行的操作
        ret = func(*args,**kwargs)  # 5.執行f()函式
        #執行函式後進行的操作
        return ret   # 6.返回一個值給函式呼叫者  inner函式名的id
    return inner   # 4.通過return把返回值給函式呼叫者  此時f = inner
@wrapper  # 1.f = wrapper(f)執行wrapper函式
def f():
    print(
666) f() 3.執行inner函式 f() = inner() 注意:return用法 1.函式遇到return時函式體結束 2.如果return後面跟上函式名則返回函式名在記憶體中的id 3.如果return後面跟上其他字元則返回其本身

2、編寫裝飾器,在每次執行被裝飾函式之前列印一句’每次執行被裝飾函式之前都得先經過這裡,這裡根據需求新增程式碼

def func1(f):
    def inner():
        print('每次執行被裝飾函式之前都得先經過這裡,這裡根據需求新增程式碼')
        f()
    return inner

@func1
def func2():
    print(
'hello world') func2()

3、編寫裝飾器,在每次執行被裝飾函式之後列印一句’每次執行完被裝飾函式之後都得先經過這裡,這裡根據需求新增程式碼

def func1(f):
    def inner():
        f()
        print('每次執行被裝飾函式之後都得先經過這裡,這裡根據需求新增程式碼')
    return 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 == 'jinyuan' and password == '123':
                f()
                break
            else:
                print('賬號密碼錯誤你還有{}次機會'.format(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
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+'\t')
        f1.write(str(f)+'\n')
        f(*args,**kwargs)
    return inner


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


func1('aa','bbb')