2016-07-25 3 views
0

次のコードを考えてみましょう:最初の引数は(ndarrayインスタンスを得たとしてFunctionCollectionインスタンスで呼び出されなければならない)それが結合していない方法(「列挙型のような」クラスと結合していないメソッド

を返し

ff = lambda x : x 
gg = lambda x : x*2 
class FunctionCollection(object): 
    f = ff 
    g = gg 

def FunctionCaller(x, Type = FunctionCollection.f): 
    return Type(x) 

y = FunctionCaller(x) 

を代わりに)

私がわからないメッセージ。 明らかな解決策は、関数ffとgg INSIDE FunctionCollectionを定義することですが、モジュールでffとggを定義することができないかどうかを知りたいのですが、それらの関数へのポインタを含む列挙型を作成し、引数としての "ポインタ"。 Cスタイルの名前をつけて申し訳ありません。

どうしたのですか?

は実際にがpython3.xに作業を行い

マイク

+0

「明白な解決策は、FF定義されるだろうし、 gg INSIDE FunctionCollection " - いいえ、役に立たないでしょう。 'y = FunctionCaller(x)'の ' – user2357112

+0

'は 'x'が定義されていますか? –

答えて

1

あなたのコード、ありがとうございます。あなたがpython2.xをサポートする必要がある場合は、staticmethodを使用することができます。

ff = lambda x : x 
gg = lambda x : x*2 
class FunctionCollection(object): 
    f = staticmethod(ff) 
    g = staticmethod(gg) 

def FunctionCaller(x, Type = FunctionCollection.f): 
    return Type(x) 

y = FunctionCaller(1.0) 
print(y) 

別のオプションは...「シングルトン」としてFunctionCollectionを使用し、単一のインスタンスに機能をバインドするだろう

ff = lambda x : x 
gg = lambda x : x*2 
class FunctionCollection(object): 
    pass 

FUNC_COLLECTION = FunctionCollection() 
FUNC_COLLECTION.f = ff 
FUNC_COLLECTION.g = gg 


def FunctionCaller(x, Type = FUNC_COLLECTION.f): 
    return Type(x) 

y = FunctionCaller(1.0) 
print(y) 

私はその後、それらの機能への「ポインタ」を含むenumを作成し、モジュールにFFとGGを定義することはできないかどうかを知りたいと思い、そして最後にそれらの "ポインタ"を引数として渡します。

これは明白な疑問を招くと思います...なぜこの間接レベルの追加が必要ですか?私には無用だと思われる。

それ 不要であると言うことは、確かではありません

- 私はまだのような目的を理解していないだけという...

+0

両方の回答ありがとう!実際にあなたが正しいです、追加間接指示の本当の理由はありません。私は単純にメインモジュールのすべての関数を書きましたが、最終的にクラスの静的メソッドとしてそれらをすべて持たせると便利だと考えました。コードを移行する前に、私は "速い方法"を試して、私はつかまったので、私の質問... :-) – Mike

関連する問題