チラ裏備忘録

情報整理

【Python文法】__call__の呼び出し方

__init__と同じように,外部から直接参照されない書き方(アンダースコア2つで囲む)で記述される__call__はどのように使うのでしょうか?

class A:
    def __init__(self, a):
        self.a = a

    def __call__(self):
        print(self.a)

hoge = A(10)
hoge()

見てわかるようにインスタンスを格納した変数()』という記述をすることで,クラス内の__call__関数を呼び出すことができます.
勿論,本来の関数と同じように,引数の有無は__call__の定義次第です.

継承

また,クラスの継承時に子クラスが親クラスの関数を利用できるようになるのと同様に,子クラスは継承した親クラスの__call__関数を利用できます.

class A:
    def __init__(self, a):
        self.a = a

    def __call__(self):
        print(self.a)

class B(A):
    def __init__(self, b):
        super().__init__(b) # self.aの初期化用


hoge = B(20)
hoge() # 20

よりわかりやすい例(余分なものを排除)

class A:
    def __init__(self):
        pass

    def __call__(self):
        print("Hello, world!")

class B(A):
    def __init__(self):
        pass

hoge = B()
hoge() # Hello, world!