この章では、Pythonにおけるデリゲート(委譲)とイベント処理について学びます。デリゲートとイベントは、関数やメソッドを動的に割り当てたり、イベント駆動型のプログラムを構築するために重要な概念です。Pythonでは、コールバック関数やリスナーの仕組みを利用して、イベント処理を実現できます。
11.1 デリゲートの宣言と使用
デリゲートは、関数を他の関数やオブジェクトに委譲する仕組みで、動的に関数を選択して実行する際に使われます。Pythonでは、関数そのものを引数として渡したり、関数を他の変数に代入することで、デリゲートのような動作を実現できます。
デリゲートの基本構造
def greet(name):
return f"Hello, {name}!"
def execute_delegate(func, value):
return func(value)
# デリゲートのように関数を渡す
result = execute_delegate(greet, "Alice")
print(result) # "Hello, Alice!"
この例では、greet
関数をexecute_delegate
関数に引数として渡し、動的に関数が実行されています。
11.2 マルチキャストデリゲートとチェーン
マルチキャストデリゲートは、複数の関数を1つのデリゲートに追加して、連鎖的に実行する仕組みです。Pythonでは、リストやその他のコレクションを使って、複数の関数を順番に実行することが可能です。
複数の関数をチェーンする例
def greet(name):
print(f"Hello, {name}!")
def farewell(name):
print(f"Goodbye, {name}!")
def execute_multicast(functions, value):
for func in functions:
func(value)
# 複数の関数をまとめて実行
func_list = [greet, farewell]
execute_multicast(func_list, "Alice")
この例では、greet
とfarewell
という2つの関数がリストに格納され、それらが順番に実行されます。
11.3 イベントの定義とハンドラーの追加
イベントは、特定の状況や操作が発生したときに、それに対応するアクション(イベントハンドラー)が実行される仕組みです。Pythonでは、関数をリスナーとしてイベントに登録し、特定のイベントが発生したときにそれらの関数が呼び出されます。
イベントリスナーの実装例
class Event:
def __init__(self):
self.handlers = []
def add_handler(self, handler):
self.handlers.append(handler)
def trigger(self, *args, **kwargs):
for handler in self.handlers:
handler(*args, **kwargs)
# イベントハンドラー関数
def on_event_fired(message):
print(f"Event fired: {message}")
# イベントの定義と使用
event = Event()
event.add_handler(on_event_fired)
event.trigger("Hello, event!")
この例では、Event
クラスがイベントの仕組みを提供し、on_event_fired
関数がイベントハンドラーとして登録され、イベントが発生すると実行されます。
11.4 ラムダ式と匿名メソッドの活用
Pythonのラムダ式は、名前を持たない小さな関数を定義するために使われます。デリゲートやイベント処理で、一度きりの関数を作成する際に便利です。
ラムダ式の基本例
def execute_delegate(func, value):
return func(value)
# ラムダ式で匿名関数を定義
result = execute_delegate(lambda x: x.upper(), "hello")
print(result) # "HELLO"
この例では、lambda
を使って小さな匿名関数が作成され、execute_delegate
関数に渡されています。
11.5 Action, Func, Predicateの使い方
Pythonには、C#のようなAction
やFunc
、Predicate
の型はありませんが、同じような機能を関数そのものを使って実現できます。
- Action: 引数を受け取って処理を行うが、値を返さない関数。
- Func: 引数を受け取って処理を行い、値を返す関数。
- Predicate: 引数を受け取って処理を行い、
True
またはFalse
を返す関数。
PythonでのActionの例
def print_message(message):
print(message)
def execute_action(action, value):
action(value)
execute_action(print_message, "This is an action!")
PythonでのFuncの例
def calculate_square(x):
return x * x
def execute_func(func, value):
return func(value)
result = execute_func(calculate_square, 5)
print(result) # 25
PythonでのPredicateの例
def is_even(n):
return n % 2 == 0
def execute_predicate(predicate, value):
return predicate(value)
result = execute_predicate(is_even, 4)
print(result) # True
まとめ
この章では、Pythonにおけるデリゲートとイベントの基本概念と応用について学びました。これにより、動的な関数の実行や、イベント駆動型のプログラムを作成するスキルが身につきました。次の章では、非同期処理と並行プログラミングについて学びます。