私はこのようなことをしたいです:
class SillyWalk(object):
@staticmethod
def is_silly_enough(walk):
return (False, "It's never silly enough")
def walk(self, appraisal_method=is_silly_enough):
self.do_stuff()
(was_good_enough, reason) = appraisal_method(self)
if not was_good_enough:
self.execute_self_modifying_code(reason)
return appraisal_method
def do_stuff(self):
pass
def execute_self_modifying_code(self, problem):
from __future__ import deepjuju
deepjuju.kiss_booboo_better(self, problem)
誰かができるという考えで
>>> silly_walk = SillyWalk()
>>> appraise = walk()
>>> is_good_walk = appraise(silly_walk)
また、魔法の機械学習を行うこともできます。この最後のビットは私にとって特に興味深いものではありません。これは、関数内のコンテキストと呼び出し元の観点の両方で静的メソッドの使用を例示する方法として私が最初に思いついたものです。
とにかく、これは実際には関数ではないため、機能しません。これは、メソッドが元の関数を返すis_silly_enoughオブジェクトです。これは、オブジェクト属性として参照されている場合にのみ「通常の」方法で機能することを意味します。問題のオブジェクトは、デコレータがの属性とその名前で最初に定義された関数の間に配置する関数によって作成されます。__get__is_silly_enoughstaticmethod()SillyWalkis_silly_enough
これは、いずれかまたはその呼び出し元appraisal_method内からのデフォルト値を使用するには、次のいずれかを行う必要があることを意味します。 SillyWalk.walk
- ただ呼び出す
appraisal_method.__get__(instance, owner)(...)のではなく呼び出すappraisal_method(...) - または、それをオブジェクトの属性として割り当ててから、そのオブジェクトプロパティを、呼び出すのと同じように呼び出すメソッドとして参照します
appraisal_method。
これらのソリューションのどちらも特にPythonic™のようには見えないので、この種の機能を取得するためのより良い方法があるのではないかと思います。基本的に、メソッドがデフォルトで特定のクラスまたは同じクラスのスコープ内で定義された静的メソッドを使用して、その日課の一部を実行するように指定する方法が必要です。
その特定の関数を呼び出さないようにするというメッセージを伝えNoneたいので、は使用しない方がいいです。またはNoneのような他の値を使用できると思いますが、a)厄介なb)表現できるように見える何かのために、余分な数行のコードや、それ以外の場合は冗長なドキュメントを作成する必要があるのは面倒なようですデフォルトパラメータとして非常に簡潔に。FalseNotImplemented
これを行うための最良の方法は何ですか?