8

Pythonにはインスタンスメソッドに関していくつかの制限があるようです。

  1. インスタンスメソッドはコピーできません。
  2. インスタンスメソッドを選択することはできません。

私はインスタンスメソッドを参照する非常にオブジェクト指向のプロジェクトに取り組んでおり、ディープコピーとピクルスの両方を使用しているため、これは私にとって問題です。酸洗いは主にマルチプロセッシングメカニズムによって行われます。

これを解決するための良い方法は何でしょうか?コピーの問題に対していくつかの醜い回避策を実行しましたが、両方の問題に対するより良い解決策を探しています。

誰か提案はありますか?

アップデート:

私のユースケース:私は小さなイベントシステムを持っています。各イベントには、.actionトリガーすることになっている関数を指す属性があり、その関数がオブジェクトのインスタンスメソッドである場合もあります。

4

3 に答える 3

15

を使用してこれを行うことができる場合がありますcopy_reg.pickle。Python 2.6の場合:

import copy_reg
import types

def reduce_method(m):
    return (getattr, (m.__self__, m.__func__.__name__))

copy_reg.pickle(types.MethodType, reduce_method)

これはメソッドのコードを保存するのではなく、その名前だけを保存します。しかし、それは一般的なケースでは正しく機能します。

これにより、ピクルスとコピーの両方が機能します!

于 2009-11-25T18:08:59.280 に答える
3

REST-RepresentationStateTransfer。メソッドではなく、状態を送信するだけです。

オブジェクトXをAからBに転送するには、これを行います。

  1. Xの状態を、便利で解析しやすい表記でエンコードします。JSONが人気です。

  2. AはJSONテキストをBに送信します。

  3. Bは、Xの状態をJSON表記でデコードし、Xを再構築します。

これが機能するには、BにXのクラスのクラス定義が必要です。Bには、Xのクラスが依存するすべての関数とその他のクラス定義が必要です。つまり、AとBの両方にすべての定義があります。オブジェクトの状態の表現のみが移動します。

RESTに関する記事を参照してください。

http://en.wikipedia.org/wiki/Representational_State_Transfer

http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

于 2009-11-25T17:36:35.440 に答える
-3

インスタンスをピクルスし、ピクルスを解除してからメソッドにアクセスします。インスタンスのメソッドを選択することは、インスタンスに依存しているため意味がありません。そうでない場合は、独立した関数として記述します。

import pickle

class A:
     def f(self):
         print 'hi'

x = A()
f = open('tmp', 'w')
r = pickle.dump(x, f)
f.close()
f = open('tmp', 'r')
pickled_x = pickle.load(f)
pickled_x.f()
于 2009-11-25T17:40:29.970 に答える