第11章: デリゲートとイベント

11-delegate-event

この章では、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")

この例では、greetfarewellという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#のようなActionFuncPredicateの型はありませんが、同じような機能を関数そのものを使って実現できます。

  • 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におけるデリゲートとイベントの基本概念と応用について学びました。これにより、動的な関数の実行や、イベント駆動型のプログラムを作成するスキルが身につきました。次の章では、非同期処理と並行プログラミングについて学びます。

目次