2009-11-25 14 views
8

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

  1. インスタンスメソッドはコピーできません。
  2. インスタンスメソッドは、ピクルできません。

私は非常にオブジェクト指向project Iはインスタンスメソッドを参照した上で動作し、deepcopying及び酸洗の両方を使用することがありますので、これは、私にとっては問題です。酸洗いは主にマルチプロセシング機構によって行われます。

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

誰にも提案はありますか?

更新:

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

+5

通常は、私たちが作業しているすべての場所にコードを提供し、状態の表現を単に動かすだけです。 Representation State Transferはより一般的で簡単です。それのどこが悪いんだい? –

+0

S.Lott、あなたは明らかにこの問題についてより多くの経験を持っていますが、もっと愚かなやり方で、正確に何を示唆しているのか、それがどう関係しているのか、「Representation State Transfer」など何かを私に説明してください。 –

+0

あなたは「私はインスタンスメソッドをピクルしたい」と言っていますが、理由は言いません。あなたが解決しようとしている問題を知るのに役立ちます。なぜなら、これを行うにはよりPythonの方法があるからです。あなたがRubyで考えているように少し聞こえる... –

答えて

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) 

このコード方式の、ちょうどその名前を格納しません。しかし、それは一般的なケースで正しく動作します。

これは、酸洗とコピーの両方を行います。

+0

良いアイデア、私はそれが最もクリーンな解決策かもしれないと思います。あなたは他の問題、コピーについて考えていますか?また、誰でも既に私が使用できる 'copy_reg'ソリューションを実装しましたか? –

+0

私は答えを編集し、いくつかのコードを追加しました。 –

3

REST - 代表状態転送。メソッドを送信するのではなく、状態を送信します。

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

  1. エンコード一部 便利、簡単に解析表記のXの状態。 JSON が人気です。

  2. AはB.

    にJSONテキストが
  3. Bは、X.

BこのためXのクラスのためのクラス定義を有していなければならない再構成、XフォームJSON 表記の状態をデコード送信働くBには、Xのクラスが依存するすべての関数と他のクラス定義が必要です。つまり、A とBの両方にすべての定義があります。オブジェクトの状態の表現だけが移動します 。

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

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

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

+0

この方法論がイベントシステムに関する私の問題にどのように関係しているか説明してください。 –

+4

これは「あなたが間違っている」という答えです。このビューはPythonで 'pickle'が多少便利かもしれないということです。 Plain Old Data(オブジェクト・グラフとは対照的に)を交換するほうが本当に簡単です。なぜなら、よりシンプルなシステムが理にかなっているからです。それには何かがありますが、それがあなたにとって有益ならば、長期的に役立つでしょう。 –

-3

インスタンスを酸洗した後、それをunpickle化した後にメソッドにアクセス。インスタンスのメソッドをpicklingすることは、インスタンスに依存しているため意味がありません。そうでない場合は、それを独立した関数として記述します。

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() 
+1

A()はインスタンスメソッドではありません。 –

+1

インスタンスメソッドではなくオブジェクトをpickleしました。インスタンスメソッドを直接picklingしてみてください。 –

+0

インスタンスをpickleし、unpickle後にメソッドにアクセスします。 インスタンスのメソッドをpicklingすることは、インスタンスに依存しているため意味がありません。そうでない場合は、それを独立した関数として記述します。 –

関連する問題