タグ

2018年6月6日のブックマーク (2件)

  • Pythonでデコレーターを継承先にも適用する2 - タロスカイ株式会社

    こんにちは、Pythonエンジニア見習いです。 Pythonでデコレーターを継承先にも適用する のデコレーターを継承先にも適用する方法に欠陥を発見したのでそれがどのようなものなのか 解説していきたいと思います。さらにその代替方法についても紹介します。 なぜクラスの__new__関数を用いる方法ではダメなのか まず、Pythonのクラスに書かれた__new__関数はそのクラスのインスタンスが 生成されるたびに 実行されます 。これにより来であれば各サブクラスごとに一回デコレーターを適用したい場面で デコレーターがインスタンス生成ごとに適用されてしまいます。わかりやすいように以下に例を示します。 まず、以下に示すようにpythonのクラスや関数が定義されているとします。 def deco(f): @functools.wraps(f) def inner(*args, **kwargs):

    Pythonでデコレーターを継承先にも適用する2 - タロスカイ株式会社
  • Pythonでデコレーターを継承先にも適用する - タロスカイ株式会社

    こんにちは、Pythonエンジニア見習いです。最近TemplateMethodパターンを使っているコードのリファクタリングをしていたところ、継承先にもデコレーターを適用したい場面に遭遇しました。その時、単純に継承元に適用するだけではうまくいかず、工夫が必要でした。今回はPythonでデコレーターを継承先にも適用する方法を皆様に紹介したいと思います。 なぜ単純に継承元に適応するだけではダメなのか 継承元の関数は継承先の関数はたとえ名前が同じであってもそれが指す関数オブジェクトは別物です。よって継承元でデコレーターを適用した場合、継承先ではそのデコレーターの適用された継承元の関数は継承先の同名の関数で上書きされます。最終的に継承先の関数ではデコレーターの適用されていない関数が残ります。 どうやったら継承先にデコレーターを適用できるのか メンバ関数がデコレートされるタイミングはクラス(インスタン

    Pythonでデコレーターを継承先にも適用する - タロスカイ株式会社