私の質問は、Python(2.6)で、オブジェクトの名前空間を使用する関数をプログラムする方法ですが、関数はオブジェクト/クラスの外部で定義されています。さらに、その関数はオブジェクトの名前空間の変数のみを変更する必要があります。名前空間を引き継ぐべきではありません(複数のオブジェクトがある場合、それらはすべて同じ名前空間を使用するため)。
これを追求する理由は、非常に小さなクラスを作成したいからです。このクラスでは、構築中に将来使用するために必要なすべての関数が既に指定self.__call__
されており、オブジェクト自体に対する後続の関数呼び出し()を直接適用できます。
このアイデアは(彼らが言うように)あまりPython的ではないことを理解し、他のさまざまな解決策(関数を別のクラスに入れてそれらを接続するなど)を考えましたが、これらの解決策のそれぞれを感じずにはいられません私が理にかなっていると思うよりもはるかに多くの作業です。
私が望むことを達成する簡単な方法の1つは次のとおりです。
class A:
def __init__(self, some_dict, func_a):
self.memory = some_dict
self.__call__ = func_a
def test_func(obj, some_input):
if some_input in obj.memory :
return obj.memory[some_input]
else :
obj.memory[some_input] = 0. # some default value
return 0.
first_object = A({}, test_func)
print first_object(first_object, '3')
これは問題なく機能しますが、オブジェクトを関数呼び出しするときに、オブジェクト自体も指定する必要があるというのが痛いです(最後の行を参照)。私はそのように電話をかけることができることを望んでいます:
print first_object('3')
これまでのところ、これを回避するための私のアイデアは成功しませんでした(たとえば、関数メソッドをコピーし、その名前空間をでリンクしますself.__call__.memory = self.memory
)。def __init__
関数を「採用」して名前空間をリンクするようにパーツを変更するものを見つけたいと思います。
私はインターネットで答えを厳密に検索しましたが、明確な解決策はまだ見つかりませんでした。次のhttp://www.velocityreviews.com/forums/t738476-inserting-class-namespace-into-method-scope.htmlは同じことを求めていますが、成功していません。
誰かがこれに取り組むための解決策を持っていますか?