6

別のインスタンスのシリアル化されたデータから読み取ることができるクラスを定義したいと考えています。簡略化されたコードは次のとおりです。

class MyClass(list):

    def __init__(self,**kwargs):
        if kwargs.has_key('fdata'):
            f = open(kwargs['fdata'],'r')
            self = pickle.load(f)
            print len(self)    #prints 320          
            f.close()              

    ...

a = MyClass(fdata='data.dat')
print len(a)    #prints 0

これは私が得る出力です:

320
0

私が抱えている問題は、内部のすべての要素を読み取ることができるにもかかわらず、返されるインスタンスが常に空であること__init__()です。何が原因でしょうか?

4

2 に答える 2

4

メソッド内での割り当てselfは、ローカル名selfを別のオブジェクトに再バインドするだけです。Python で生の名前に代入しても、オブジェクトを変更することはできません。名前を再バインドするだけです。

なぜあなたはストレートフォワードを使わないのですか

with open("data.dat") as f:
    a = pickle.load(f)

新しいクラスを構築する代わりに?これが気に入らない場合は、これを関数でラップしますが、このコードを に入れるのはあまり役に立ちません__init__()

同じ効果を達成する他の方法があります。おそらく、あなたがしようとしていることを正確に達成するための最良の方法は、新しいインスタンスが構築されるに–が呼び出される__new__()代わりに上書きすることです。__init__()__new__()

于 2012-06-28T12:19:12.920 に答える
3

selfPythonの通常のローカル変数です。self = otherオブジェクトを他の何かに「する」ために使用することはできません。ローカルを再割り当てするだけです。属性を1つずつ復元するか、次のようなものを使用する必要があります。

self.__dict__ = pickle.load(f).__dict__

(私はその最後の行をテストしていません、それはあなたの子猫を爆発させるかもしれません。)

于 2012-06-28T12:17:29.803 に答える