1、クローズドの原則を開きます。
(1)オープンコード拡張
デザインで始まる任意のプログラムは、すべての機能および任意の将来のアップデートや修正なしで考えていませんでした。だから我々は、新しい機能を追加し、コード拡張を許可する必要があります。
(2)ソースコードが閉じられた変更
今回は我々が呼ばれる内部関数を変更したり、機能を変更した場合、使用することを他の人に配信された関数を記述すると、すでに機能を使用して他のユーザーに影響を与える可能性があります。
ソースコードと通話モードを変更せずに、機能が追加オープンクローズドの原則を追加することです
2、デコレータ:
本来の機能を変更することなく、装飾的なだけでなく、ソースコードが追加機能を追加するために、呼ばれています。
(1)最初のデコレータに会いました:
デコレーション(追加機能)(ツール:機能)
import time
def index():
time.sleep(2) #
print("这是小明写的功能")
def func():
time.sleep(1) #
print("这是小刚写的功能")
def red():
time.sleep(2) #
print("这是小红写的功能")
start_time = time.time() # 时间戳
index()
print(time.time() - start_time)
start_time = time.time() # 时间戳
func()
print(time.time() - start_time)
start_time = time.time() # 时间戳
red()
print(time.time() - start_time)
(1970年1月1日に0:00:00時点からこの時点で秒数でも、タイムスタンプと呼ばれるこの方法は、GMTを返し、それが変更されています。)
import time
print(time.time())
上記のコードを繰り返し、退屈
シーク時間が改善:(関数で記述されている、関数は、関数指向である、)コードの重複を減らします
import time
def index():
time.sleep(2) #
print("这是小明写的功能")
def func():
time.sleep(1) #
print("这是小刚写的功能")
def red():
time.sleep(2) #
print("这是小红写的功能")
def times(func):
start_time = time.time() # 时间戳
func()
print(time.time() - start_time)
times(index)
times(func)
改良:
第一版装饰器
import time
def func():
time.sleep(1) #
print("这是小刚写的功能")
def red():
time.sleep(2) #
print("这是小红写的功能")
def index():
time.sleep(2) #
print("这是小明写的功能")
def times(func):
def foo():
start_time = time.time() # 时间戳 被装饰函数执行前干的事
func()
print(time.time() - start_time) # 被装饰函数执行后干的事
return foo # 不能加括号
index = times(index) # 不能加括号
index()
func = times(func)
func()
(2)シンタックスシュガーは(私たちはことを行うに役立ちます)
装飾的な機能の上に書かれたシンタックスシュガーに
def warpper(f):
def inner():
print("111")
f()
print("222")
return inner
# python帮咱们做的一个东西,语法糖
@warpper # func = warpper(func)
def func():
print("被装饰的函数1")
@warpper # index = warpper(index)
def index():
print("被装饰的函数2")
func()
def warpper(f):
def inner(*args,**kwargs):
print("被装饰函数执行前")
ret = f(*args,**kwargs)
print("被装饰函数执行后")
return ret
return inner
@warpper
def func(*args,**kwargs):
print(f"被装饰的{args,kwargs}")
return "我是func函数"
@warpper
def index(*args,**kwargs):
print(11111)
print(func(1,2,3,4,5,6,7,8,a=1))
(3)のStandard Editionデコレータ。
def wrapper(func):
def inner(*args,**kwargs):
'''执行被装饰函数之前的操作'''
ret = func()
'''执行被装饰函数之后的操作'''
return ret
return inner
これは、コードのオープンクローズの原則に完全に準拠し、標準のデコレータです。
4、デコレータアドバンスト
(1)基準デコレータ
def auth(argv):
def warpper(func):
def inner(*args,**kwargs):
if argv == "博客园":
print("欢迎登录博客园")
user = input("user:")
pwd = input("pwd:")
if user == 'alex' and pwd == "dsb":
func(*args,**kwargs)
elif argv == "码云":
print("欢迎登录码云")
user = input("user:")
pwd = input("pwd:")
if user == 'alex' and pwd == "jsdsb":
func(*args, **kwargs)
return inner
return warpper
def foo():
print("被装饰的函数")
msg = input("请输入您要登录的名字:")
a = auth(msg)
foo = a(foo)
foo()
def auth(argv):
def wrapper(func):
def inner(*args,**kwargs):
if argv:
print("我加上功能了!")
func(*args,**kwargs)
else:
func(*args,**kwargs)
return inner
return wrapper
https://www.cnblogs.com/
@auth(True) # @auth == foo = wrapper(foo) = auth(True) flask框架
def foo():
print("这是一个点燃")
foo()
装飾関数デコレータの(2)複数の
デコレータ装飾機能、複数の最寄りデコレータから装飾される関数を実行します
def auth(func): # wrapper1装饰器里的 inner
def inner(*args,**kwargs):
print("额外增加了一道 锅包肉")
func(*args,**kwargs)
print("锅包肉 38元")
return inner
def wrapper1(func): # warpper2装饰器里的 inner
def inner(*args,**kwargs):
print("额外增加了一道 刺生")
func(*args,**kwargs)
print("刺生 白吃")
return inner
def wrapper2(func): # 被装饰的函数foo
def inner(*args,**kwargs):
print("额外增加了一道 麻辣哥")
func(*args,**kwargs)
print("难以下嘴")
return inner
def foo():
print("这是一个元宝虾饭店")
foo = wrapper2(foo) # inner = wrapper2(foo)
foo = wrapper1(foo) # inner = wrapper1(inner)
foo = auth(foo) # inner = auth(inner)
foo() # auth里边的inner()
def auth(func): # wrapper1装饰器里的 inner
def inner(*args,**kwargs):
print(123)
func(*args,**kwargs)
print(321)
return inner
def wrapper1(func): # warpper2装饰器里的 inner
def inner(*args,**kwargs):
print(111)
func(*args,**kwargs)
return inner
def wrapper2(func): # 被装饰的函数foo
def inner(*args,**kwargs):
print(222)
func(*args,**kwargs)
print(567)
return inner
@auth # 1 7
@wrapper1 # 2 6
@wrapper2 # 3 5
def foo(): # 4
print("www.baidu.com")
foo()