Pythonの初心者はデコレータを学びます

python機能プログラミング用のデコレータ

1. オープンとクローズの原則

簡単に言えば、それは拡張に対してオープンであり、変更に対してクローズです。

オブジェクト指向のプログラミングでは、さまざまな関数が定義されることがよくあります。関数の使用は、定義フェーズと使用フェーズに分けられ、関数が定義された後、多くの場所で呼び出される可能性があります。つまり、関数の定義段階のコードを変更すると、多くの場所が影響を受けますが、現時点では、小さな場所の変更によるシステム全体の崩壊に影響を与えやすいため、現代のプログラム開発業界では、システムオンラインになると、システムのソースコードを変更することはできなくなります。ただし、システムの起動後、ユーザー数の増加に伴い、システムの拡張に新しい機能が追加されます。

現時点では、元のシステムのソースコードを変更することはできず、元のシステム開発に新しい機能を追加する必要があります。これは、プログラム開発業界のオープンおよびクローズド原則です。このとき、デコレータが必要です。

2. デコレータとは

デコレータは、その名前が示すように、他のオブジェクトを装飾および変更するためのツールです。

したがって、デコレータは任意の呼び出し可能オブジェクトにすることができ、装飾されたオブジェクトは任意の呼び出し可能オブジェクトにすることもできます。

3. デコレーターの役割

ソースコードを変更したり、装飾されたオブジェクトのメソッドを呼び出したりせずに、装飾されたオブジェクトに新しい関数を追加します。

原則として:

  1. 装飾されたオブジェクトのソースコードを変更しないでください

  2. 装飾されたオブジェクトの呼び出しメソッドを変更しないでください

目的:

装飾されたオブジェクトに新しい関数を追加します。

拡張の例:

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

Pythonの初心者はデコレータを学びます
Python3のルーチンについて学ぶ
pythonをすばやく学ぶ方法
pythonデコレータが不明瞭にならないようにする
Pythonでのガベージコレクションについて学ぶ
Excelを比較し、Pythonウィンドウ関数を学ぶ
pythonクローラーは簡単に習得できますか
プログラミングの基礎なしでpythonを学ぶことはできますか
Python初心者は、標準のライブラリモジュールの命名を学びます
1分でPythonを学ぶ|オブジェクト指向(中国語)
1分でPythonを学ぶ| Python関数(オン)
Pythonタイムモジュールを学ぶ方法