__Setstate__ এবং __getstate__ এর সাধারণ উদাহরণ


92

আমি কী জানি না __setstate__এবং __getstate__পদ্ধতিগুলি কী করে, তাই আমাকে একটি সাধারণ উদাহরণ দিয়ে সহায়তা করুন।


25
দস্তাবেজগুলি যাইহোক এই বিষয়টিতে খুব ভাল নয়।
ম্যাট লুঙ্গো

উত্তর:


80

পাইথনের জন্য এখানে একটি খুব সাধারণ উদাহরণ যা আচার ডক্সকে পরিপূরক করা উচিত ।

class Foo(object):
  def __init__(self, val=2):
     self.val = val
  def __getstate__(self):
     print("I'm being pickled")
     self.val *= 2
     return self.__dict__
  def __setstate__(self, d):
     print("I'm being unpickled with these values: " + repr(d))
     self.__dict__ = d
     self.val *= 3

import pickle
f = Foo()
f_data = pickle.dumps(f)
f_new = pickle.loads(f_data)

9
এই উত্তরের পরিপূরক হিসাবে এটি "আমাকে সংমিশ্রিত করা হচ্ছে" মুদ্রণ করে, তারপরে "আমি এই মানগুলির সাথে একরকম হয়ে উঠছি: val 'ভাল': 4}", এবং f_new.val 12 হয়
টিমডিপিউও

45

নূন্যতম উদাহরণ

যা বাইরে আসে তা getstategoesুকে যায় setstate। এটি ডিক হওয়ার দরকার নেই।

যাই হোক না কেন আসে আউট getstatepickeable হতে হবে, মত মৌলিক অন্তর্নির্মিত ইনস দিয়ে গঠিত যেমন int, str, list

class C(object):
    def __init__(self, i):
        self.i = i
    def __getstate__(self):
        return self.i
    def __setstate__(self, i):
        self.i = i
assert pickle.loads(pickle.dumps(C(1), -1)).i == 1

ডিফল্ট __setstate__

ডিফল্ট __setstate__লাগে a dict

self.__dict__https://stackoverflow.com/a/1939384/895245 এর মতো একটি ভাল পছন্দ , তবে কী চলছে তা ভাল করে দেখার জন্য আমরা নিজেরাই একটি তৈরি করতে পারি:

class C(object):
    def __init__(self, i):
        self.i = i
    def __getstate__(self):
        return {'i': self.i}
assert pickle.loads(pickle.dumps(C(1), -1)).i == 1

ডিফল্ট __getstate__

সমতুল্য __setstate__

class C(object):
    def __init__(self, i):
        self.i = i
    def __setstate__(self, d):
        self.i = d['i']
assert pickle.loads(pickle.dumps(C(1), -1)).i == 1

__slots__ বস্তু নেই __dict__

যদি বস্তুটি থাকে __slots__তবে তা নেই__dict__

আপনি যদি উভয়ই প্রয়োগ করতে চলেছেন getএবং setstate, ডিফল্ট-ইশ উপায় হ'ল:

class C(object):
    __slots__ = 'i'
    def __init__(self, i):
        self.i = i
    def __getsate__(self):
        return { slot: getattr(self, slot) for slot in self.__slots__ }
    def __setsate__(self, d):
        for slot in d:
            setattr(self, slot, d[slot])
assert pickle.loads(pickle.dumps(C(1), -1)).i == 1

__slots__ ডিফল্ট পেতে এবং সেট একটি tuple আশা করে

আপনি যদি ডিফল্টটিকে পুনরায় ব্যবহার করতে চান __getstate__বা __setstate__, আপনাকে চারপাশে টিপলগুলি পাস করতে হবে:

class C(object):
    __slots__ = 'i'
    def __init__(self, i):
        self.i = i
    def __getsate__(self):
        return (None, { slot: getattr(self, slot) for slot in self.__slots__ })
assert pickle.loads(pickle.dumps(C(1), -1)).i == 1

আমি নিশ্চিত না এটি কীসের জন্য।

উত্তরাধিকার

প্রথমে দেখুন যে পিকিং ডিফল্টরূপে কাজ করে:

class C(object):
    def __init__(self, i):
        self.i = i
class D(C):
    def __init__(self, i, j):
        super(D, self).__init__(i)
        self.j = j
d = pickle.loads(pickle.dumps(D(1, 2), -1))
assert d.i == 1
assert d.j == 2

উত্তরাধিকার রীতিনীতি __getstate__

ছাড়া __slots__এটা সহজ, যেহেতু __dict__জন্য Dরয়েছে __dict__জন্য C, তাই আমরা স্পর্শ করতে প্রয়োজন হবে না Cএ সব:

class C(object):
    def __init__(self, i):
        self.i = i
class D(C):
    def __init__(self, i, j):
        super(D, self).__init__(i)
        self.j = j
    def __getstate__(self):
        return self.__dict__
    def __setstate__(self, d):
        self.__dict__ = d
d = pickle.loads(pickle.dumps(D(1, 2), -1))
assert d.i == 1
assert d.j == 2

উত্তরাধিকার এবং __slots__

এর সাথে __slots__, আমাদের বেস ক্লাসে ফরোয়ার্ড করা দরকার, এবং চারপাশে টিপলগুলি পাস করতে পারি:

class C(object):
    __slots__ = 'i'
    def __init__(self, i):
        self.i = i
    def __getstate__(self):
        return { slot: getattr(self, slot) for slot in C.__slots__ }
    def __setstate__(self, d):
        for slot in d:
            setattr(self, slot, d[slot])

class D(C):
    __slots__ = 'j'
    def __init__(self, i, j):
        super(D, self).__init__(i)
        self.j = j
    def __getstate__(self):
        return (
            C.__getstate__(self),
            { slot: getattr(self, slot) for slot in self.__slots__ }
        )
    def __setstate__(self, ds):
        C.__setstate__(self, ds[0])
        d = ds[1]
        for slot in d:
            setattr(self, slot, d[slot])

d = pickle.loads(pickle.dumps(D(1, 2), -1))
assert d.i == 1
assert d.j == 2

দুর্ভাগ্যক্রমে ডিফল্ট __getstate__এবং __setstate__বেসটির পুনরায় ব্যবহার করা সম্ভব নয় : https://groups.google.com/forum/#!topic/python-ideas/QkvOwa1-pHQ আমরা সেগুলি সংজ্ঞায়িত করতে বাধ্য হই।

পাইথন ২.7.১২ তে পরীক্ষা করা হয়েছে। গিটহাব উজানের দিকে


10

এই পদ্ধতিগুলি কীভাবে আচার মডিউল দ্বারা বস্তুগুলি পিক এবং আন-পিকেল করা হয় তা নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয় । এটি সাধারণত স্বয়ংক্রিয়ভাবে পরিচালনা করা হয়, সুতরাং যদি না কোনও ক্লাস কীভাবে পিক করা হয় বা আনপিক করা হয় সে বিষয়ে আপনাকে ওভাররাইড করার প্রয়োজন নেই তবে আপনার এটি নিয়ে চিন্তা করার দরকার নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.