自己参照で、そしてスロットのあるクラスからオブジェクトを漬けて解き放つ方法は?

StackOverflow https://stackoverflow.com/questions/2922628

  •  05-10-2019
  •  | 
  •  

質問

このオブジェクトがその属性の1つを介してそれ自体を参照するとき、スロットのあるクラスからオブジェクトを漬ける正しい方法は何ですか?ここに簡単な例があります。現在の実装では、100%正しいとはわかりません。

import weakref
import pickle

class my_class(object):

    __slots__ = ('an_int', 'ref_to_self', '__weakref__')

    def __init__(self):
        self.an_int = 42
        self.ref_to_self = weakref.WeakKeyDictionary({self: 1})

    # How to best write __getstate__ and __setstate__?
    def __getstate__(self):

        obj_slot_values = dict((k, getattr(self, k)) for k in self.__slots__)
        # Conversion to a usual dictionary:
        obj_slot_values['ref_to_self'] = dict(obj_slot_values['ref_to_self'])
        # Unpicklable weakref object:
        del obj_slot_values['__weakref__']
        return obj_slot_values

    def __setstate__(self, data_dict):
        # print data_dict
        for (name, value) in data_dict.iteritems():
            setattr(self, name, value)
        # Conversion of the dict back to a WeakKeyDictionary:
        self.ref_to_self = weakref.WeakKeyDictionary(
            self.ref_to_self.iteritems())

これは、例えば次のようにテストできます。

def test_pickling(obj):
    "Pickles obj and unpickles it.  Returns the unpickled object"

    obj_pickled = pickle.dumps(obj)
    obj_unpickled = pickle.loads(obj_pickled)

    # Self-references should be kept:
    print "OK?", obj_unpickled == obj_unpickled.ref_to_self.keys()[0]
    print "OK?", isinstance(obj_unpickled.ref_to_self,
                            weakref.WeakKeyDictionary)

    return obj_unpickled

if __name__ == '__main__':
    obj = my_class()
    obj_unpickled = test_pickling(obj)
    obj_unpickled2 = test_pickling(obj_unpickled)

これは正しい/堅牢な実装ですか?どのようにすべき __getstate____setstate__ もしあれば書かれてください my_class クラスから継承されます __slots__?内部にメモリリークがありますか __setstate__ 「循環」dictのために?

に発言があります PEP 307 それは私が漬物かどうか疑問に思う my_class オブジェクトは堅牢な方法で可能になります:

__getstate__ メソッドは、オブジェクト自体を参照せずにオブジェクトの状態を表す選択可能な値を返す必要があります。

これは、オブジェクト自体への参照が漬けられているという事実と衝突しますか?

それは多くの質問です:あらゆる発言、コメント、またはアドバイスは大歓迎です!

役に立ちましたか?

解決

元の投稿が示唆していることは、十分に機能するように見えます。

PEP 307が読むものについては:

__getState__メソッドは、オブジェクト自体を参照せずにオブジェクトの状態を表す選択可能な値を返す必要があります。

私はそれがということだけを意味することを理解しています __getstate__ メソッドは、(未熟な)元のオブジェクトを指す表現を単に返す必要があります。したがって、元の(象徴的でない)オブジェクトへの参照が作成されていない限り、それ自体を参照するオブジェクトを返すことは問題ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top