18

私はPythonで次のことをしようとしています:

foo.pyというファイルの場合:

# simple function that does something:
def myFunction(a,b,c):
  print "call to myFunction:",a,b,c

# class used to store some data:
class data:
  fn = None

# assign function to the class for storage.
data.fn = myFunction

そして、bar.pyというファイルで:import foo

d = foo.data
d.fn(1,2,3)

ただし、次のエラーが発生します。

TypeError:バインドされていないメソッドf()は、最初の引数としてデータインスタンスを使用して呼び出す必要があります(代わりにintインスタンスを取得します)

これは私が思うに十分に公平です-pythonはd.myFunctionをクラスメソッドとして扱っています。ただし、通常の関数として処理する必要があるため、未使用の「self」パラメーターをmyFunction定義に追加せずに呼び出すことができます。

したがって、問題は次のとおりです。

関数がそのクラスにバインドされることなく、関数をクラスオブジェクトに格納するにはどうすればよいですか?

4

3 に答える 3

27
data.fn = staticmethod(myFunction)

トリックを行う必要があります。

于 2008-11-29T12:28:33.927 に答える
1

あなたができることは次のとおりです。

d = foo.data()
d.fn = myFunction

d.fn(1,2,3)

これはまさにあなたが望むものではないかもしれませんが、うまくいきます。

于 2008-11-29T13:38:20.557 に答える
0

答えてくれたアンドレに感謝します-とても簡単です!

気になる方は、問題の文脈全体を含めるべきだったかもしれません。とにかくここにあります:

私のアプリケーションでは、ユーザーは Python でプラグインを作成できます。明確に定義されたパラメーター リストを使用して関数を定義する必要がありますが、名前付け規則を課したくありませんでした。

したがって、ユーザーが正しい数のパラメーターと型を使用して関数を作成する限り、次のようなことを行う必要があります (覚えておいてください、これはプラグイン コードです)。

# this is my custom code - all plugins are called with a modified sys.path, so this
# imports some magic python code that defines the functions used below.
from specialPluginHelperModule import *

# define the function that does all the work in this plugin:
def mySpecialFn(paramA, paramB, paramC):
    # do some work here with the parameters above:
    pass

# set the above function:
setPluginFunction(mySpecialFn)

への呼び出しsetPluginFunctionは、関数オブジェクトを受け取り、非表示のクラス オブジェクトに設定します (他のプラグイン構成関連のものと同様に、この例は多少単純化されています)。メイン アプリケーションが関数を実行する場合、runpyモジュールを使用してプラグイン コードを実行し、上記のクラス オブジェクトを抽出します。これにより、構成データとプラグイン関数が得られるため、きれいに実行できます (名前空間を汚染することなく)。 )。

このプロセス全体は、同じ入力に対して異なるプラグインに対して複数回繰り返され、私にとっては非常にうまく機能しているようです.

于 2008-11-30T10:21:24.167 に答える