python機能プログラミング用のデコレータ
1. オープンとクローズの原則
簡単に言えば、それは拡張に対してオープンであり、変更に対してクローズです。
オブジェクト指向のプログラミングでは、さまざまな関数が定義されることがよくあります。関数の使用は、定義フェーズと使用フェーズに分けられ、関数が定義された後、多くの場所で呼び出される可能性があります。つまり、関数の定義段階のコードを変更すると、多くの場所が影響を受けますが、現時点では、小さな場所の変更によるシステム全体の崩壊に影響を与えやすいため、現代のプログラム開発業界では、システムオンラインになると、システムのソースコードを変更することはできなくなります。ただし、システムの起動後、ユーザー数の増加に伴い、システムの拡張に新しい機能が追加されます。
現時点では、元のシステムのソースコードを変更することはできず、元のシステム開発に新しい機能を追加する必要があります。これは、プログラム開発業界のオープンおよびクローズド原則です。このとき、デコレータが必要です。
2. デコレータとは
デコレータは、その名前が示すように、他のオブジェクトを装飾および変更するためのツールです。
したがって、デコレータは任意の呼び出し可能オブジェクトにすることができ、装飾されたオブジェクトは任意の呼び出し可能オブジェクトにすることもできます。
3. デコレーターの役割
ソースコードを変更したり、装飾されたオブジェクトのメソッドを呼び出したりせずに、装飾されたオブジェクトに新しい関数を追加します。
原則として:
装飾されたオブジェクトのソースコードを変更しないでください
装飾されたオブジェクトの呼び出しメソッドを変更しないでください
目的:
装飾されたオブジェクトに新しい関数を追加します。
拡張の例:
import time
# デコレータ機能
def wrapper(func):
def done(*args,**kwargs):
start_time = time.time()func(*args,**kwargs)
stop_time = time.time()print('the func run time is %s'%(stop_time - start_time))return done
# 装飾機能1
@ wrapper
def test1():
time.sleep(1)print("in the test1")
# 装飾機能2
@ wrapper
def test2(name): #1.test2===wrapper(test2)2.test2(name)==dome(name)
time.sleep(2)print("in the test2,the arg is %s"%name)
# 転送
test1()test2("Hello World")
パラメータのない例:
import time
user,passwd ='admin','admin'
def auth(auth_type):print("auth func:",auth_type)
def outer_wrapper(func):
def wrapper(*args,**kwargs):print("wrapper func args:",*args,**kwargs)if auth_type =="local":
username =input("Username:").strip()
password =input("Password:").strip()if user == username and passwd == password:print("3[32;1mUser has passed authentication3[0m")
res =func(*args,**kwargs) # from home
print("---after authenticaion ")return res
else:exit("3[31;1mInvalid username or password3[0m")
elif auth_type =="ldap":print("ldapリンク")return wrapper
return outer_wrapper
@ auth(auth_type="local") # home =wrapper()
def home():print("welcome to home page")return"from home"
@ auth(auth_type="ldap")
def bbs():print("welcome to bbs page"print(home()) #wrapper()bbs()
Python初心者向けのデコレータの学習に関するこの記事はこれで終わりです。Pythonデコレータの導入の詳細については、ZaLou.Cnの以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後、ZaLou.Cnをさらにサポートしていただければ幸いです。 !
Recommended Posts