1. ホーム
  2. python

[解決済み] Python __call__ 特殊メソッド実践例

2022-04-23 19:16:44

質問

私は、以下のことを知っています。 __call__ メソッドは、クラスのインスタンスが呼び出されたときに起動されます。しかし、この特別なメソッドをいつ使うことができるのか、まったくわかりません。 __call__ メソッドを呼び出し、インスタンスを呼び出す代わりに、メソッドを呼び出せばよいのです。

この特別なメソッドの実用的な使い方を教えてくれる人がいたら、本当にありがたいです。

どのように解決するのですか?

Djangoのフォームモジュールでは __call__ メソッドをうまく使って、フォームバリデーションのための一貫した API を実装しています。Django では、フォームのための独自のバリデーターを関数として書くことができます。

def custom_validator(value):
    #your validation logic

Django には、メールバリデータや url バリデータなどのデフォルトの組み込みバリデータがありますが、これらは広義に RegEx バリデータに分類されます。これらをきれいに実装するために、 Django は (関数の代わりに) 呼び出し可能なクラスに頼っています。デフォルトの Regex Validation ロジックを RegexValidator に実装し、他の Validation のためにこれらのクラスを拡張しています。

class RegexValidator(object):
    def __call__(self, value):
        # validation logic

class URLValidator(RegexValidator):
    def __call__(self, value):
        super(URLValidator, self).__call__(value)
        #additional logic

class EmailValidator(RegexValidator):
    # some logic

これで、カスタム関数と組み込みの EmailValidator の両方を同じ構文で呼び出すことができるようになりました。

for v in [custom_validator, EmailValidator()]:
    v(value) # <-----

見ての通り、この Django での実装は、以下の他の方の回答で説明されていることと同様です。これを他の方法で実装することは可能でしょうか?可能ですが、 Django のような大きなフレームワークでは、読みやすさや簡単な拡張性が劣るだろうと IMHO は考えています。