呼び出し可能オブジェクトの目的は何ですか?彼らはどのような問題を解決しますか?
3 に答える
Python ではさまざまな種類のオブジェクトを呼び出すことができ、さまざまな目的に使用できます。
- 関数は呼び出し可能であり、外部関数からの「クロージャー」を運ぶことができます
- クラスは呼び出し可能であり、クラスを呼び出すとそのクラスのインスタンスが取得されます
- メソッドは、特にインスタンスに関連する関数のような動作のために呼び出し可能です
- staticmethods と classmethods は、機能が何らかの意味で「クラス全体」に関係する場合、メソッドのような機能のために呼び出し可能です (classmethod も同様に機能する可能性があるため、staticmethods の有用性は疑わしいです;-)
- ジェネレーターは呼び出し可能であり、ジェネレーターを呼び出すとイテレーター オブジェクトが取得されます
- 最後に、これは特にあなたが求めていたものかもしれません (上記のすべてがオブジェクトであることに気付いていません...!!!)、インスタンスが呼び出し可能なクラスをコーディングできます: これは多くの場合、呼び出しを行う最も簡単な方法ですインスタンスの状態を更新し、それに依存します (適切なクロージャーを持つ関数とバインドされたメソッドは代替手段を提供しますが、呼び出し可能なインスタンスは、呼び出しとその他の特定の操作の両方を実行する必要がある場合に使用する 1 つの方法です)。同じオブジェクト: たとえば、呼び出し可能にするだけでなく、インデックス作成も適用したいオブジェクトは、呼び出し可能でインデックス可能であるクラスのインスタンスである方がよい;-)。
「彼らが解決する問題」の種類の例は、Python の標準ライブラリによって提供されています。Python の標準ライブラリには、私が上で言及した特定のタイプのそれぞれの多くのケースがあります。
それらはパラメータを取り、それらのパラメータに応じて結果を返します。
呼び出し可能オブジェクトは、オブジェクトが関数のように機能する(つまり、パラメーターを受け入れる)ことを定義するインターフェースの関数またはインターフェースの単なる抽象的な形式です。
関数はファーストクラスのオブジェクトであるため、関数が呼び出し可能なオブジェクトであることは明らかです。メソッドについて話している場合、これは、算術演算や、オブジェクトを呼び出し__call__
た場合に何が起こるかを定義するためなど、カスタムオブジェクトの動作をオーバーロードできる多くの特別なメソッドの1つにすぎません。
このようなものを使用する理由の1つは、それ自体が他のオブジェクトを作成するある種のファクトリオブジェクトを用意することです。
特に「関数関数の関数を呼び出す関数」には、オブジェクトのネストが少ない領域があります。
関数を呼び出す前に承認レベルをチェックする従来のデコレータを作成することを検討してください。それを使用することは明らかです:
@check_authorization(level="Manager")
def update_price(Item, new_price):...
ネストされた関数としてこれを行うことができます:
def check_authorization(level):
def take_params(function):
def concrete(*args, **kwargs):
if user_level_greater_than(level):
return function(*args,
**kwargs)
return None
return concrete
return take_params
または、これをクラスとして行うことができます。これはより明確になる可能性があります。
class check_authorization(object):
def __init__(level):
self.level = level
def __call__(function):
self.function = function
return self.dec
def dec(self, *args, **kwargs):
if user_level_greater_than(self.level):
return self.function(*args,v**kwargs)
return None
多くの人は、このフラットな方法がより明確であることに気付くでしょう。もちろん、署名とメタデータが正しいのが好きなので、不正行為を信じています。
from dectools.dectools import make_call_if
@make_call_if
def check_authorization(function, arg, kwargs, level):
return user_level_greater_than(level)
呼び出し可能オブジェクトは、いくつかの既知のアプリケーションに適したツールであり、実生活で投げかけられる奇妙な問題にも役立つ可能性があります。