ブログの仕上げday12

Pythonの12日目

閉鎖機能

クローズド(閉じた関数内部関数)パッケージ(含む):内部関数への外部参照はなく、グローバルスコープのスコープの機能。

パラメータ渡しの関数として、2種類の方法

  1. パラメータを使用します

    def func(x):
        print(x)
    
    func(1)
  2. 契約機能

    def func(x):
    #    x = 1
        def f1():
            print(x)
        return f1
    
    f2 = func(2)

デコレーター

いいえ参照デコレータありません

デコレータは何ですか

デコレータは、デコレータは、装飾する機能を追加するために自然の関数であります

二つのことに注意してください:

  • デコレータ関数オブジェクト自体は、いずれかを呼び出すことができます
  • オブジェクトはまた、任意の関数呼び出し可能オブジェクトで飾らすることができます

達成デコレータは、2つの原則に従わなければなりません

1. 不修改被装饰对象的源代码
2. 不修改被装饰对象的调用方式

デコレーターの使用状況

import time

def index():
    print('welcome to index')
    time.sleep(1)
    
    return 123

def home(name):
    print(f'welcome {name} to page')
    time.sleep(1)
    
    return name

def time_count(func):
    #func = 最原始的index
    def wrapper(*args,**kwargs):
        start = time.time()
        res = func(*args,**kwargs)
        end = time.time()
        print(f'{func} time is {start - end}')
        
        return res
    return wrapper

home = time_count(home)
home('simple')

index = time_count(index)
index()

デコレータのシンタックスシュガー

#在被装饰函数上面单独写上@装饰器名
@time_count
# @time_count 就等于 home = time_count(home)
def home(name):
    print(f'welcome {name} to page')
    time.sleep(1)
    
    return name

装飾的なテンプレート

def deco(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return wrapper

パラメータデコレータがあります。

#三层函数
username_list = []

def sanceng(role):
    def login_deco(func):
        def wrapper(*args, **kwargs):
            if username_list:
                print('已经登录,请勿重复登录')
                res = func(*args, **kwargs)
                return res

            username_inp = input('请输入用户名:')
            pwd_inp = input('请输入密码:')

            with open(f'{role}_info.txt', 'r', encoding='utf8') as fr:
                for user_info in fr:
                    username, pwd = user_info.strip().split(':')
                    if username_inp == username and pwd_inp == pwd:
                        print('登录成功')
                        username_list.append(username)
                        res = func(*args, **kwargs)
                        return res
                else:
                    print('登录失败')
        return wrapper
    return login_deco

@sanceng('admin')
def index(x, y):
    print('index')
    print('x,y', x, y)
    return 123

res = index(10, 20)

おすすめ

転載: www.cnblogs.com/samoo/p/11574641.html
おすすめ