🥳

`__call__()`メソッドについて解説

2023/06/17に公開

はじめに

Pythonで書かれたOSSの中身には__call__()というメソッドが含まれていることが多いです。どういう時にこのメソッドが使われるのか分からなかったので、そのあたりをしっかりと調べて纏めてみました。

__call__メソッドで何ができるのか

__call__()メソッドの使用することで、主に以下の2つを実現することができます。

  1. インスタンスの振る舞いをカスタマイズする: __call__()メソッドを使用すると、クラスのインスタンスが関数のように振る舞うようにカスタマイズできます。これにより、インスタンスの振る舞いをより直感的に、またはより柔軟に制御することができます。

  2. 状態を持つ関数を作成する: 通常の関数は状態を持つことができません(つまり、関数の呼び出し間で情報を保持することができません)。しかし、__call__()メソッドを持つクラスのインスタンスは状態を持つことができます。これにより、状態を持つ関数(または関数オブジェクト)を作成することができます。

具体的な使用法

以下の例のように、クラスのインスタンスを関数のように呼び出すことができます。つまり、__call__()メソッドを定義したクラスのインスタンスを、関数呼び出しの構文(例:instance())で使用することができます。

以下に、__call__()メソッドの使用例を示します:

class Greeter:
    def __init__(self, greeting):
        self.greeting = greeting

    def __call__(self, name):
        return f"{self.greeting}, {name}!"

greeter = Greeter("Hello")
print(greeter("World"))  # Outputs: Hello, World!

この例では、Greeterクラスに__call__()メソッドを定義しています。このメソッドは、nameという引数を取り、挨拶のメッセージを返します。Greeterのインスタンスgreeterを作成した後、このインスタンスを関数のように呼び出すことができます。

Discussion