Pythonの12日目
閉鎖機能
クローズド(閉じた関数内部関数)パッケージ(含む):内部関数への外部参照はなく、グローバルスコープのスコープの機能。
パラメータ渡しの関数として、2種類の方法
パラメータを使用します
def func(x): print(x) func(1)
契約機能
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)