আমি কী জানি না __setstate__
এবং __getstate__
পদ্ধতিগুলি কী করে, তাই আমাকে একটি সাধারণ উদাহরণ দিয়ে সহায়তা করুন।
উত্তর:
পাইথনের জন্য এখানে একটি খুব সাধারণ উদাহরণ যা আচার ডক্সকে পরিপূরক করা উচিত ।
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)
নূন্যতম উদাহরণ
যা বাইরে আসে তা getstate
goesুকে যায় setstate
। এটি ডিক হওয়ার দরকার নেই।
যাই হোক না কেন আসে আউট getstate
pickeable হতে হবে, মত মৌলিক অন্তর্নির্মিত ইনস দিয়ে গঠিত যেমন 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.১২ তে পরীক্ষা করা হয়েছে। গিটহাব উজানের দিকে ।
এই পদ্ধতিগুলি কীভাবে আচার মডিউল দ্বারা বস্তুগুলি পিক এবং আন-পিকেল করা হয় তা নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয় । এটি সাধারণত স্বয়ংক্রিয়ভাবে পরিচালনা করা হয়, সুতরাং যদি না কোনও ক্লাস কীভাবে পিক করা হয় বা আনপিক করা হয় সে বিষয়ে আপনাকে ওভাররাইড করার প্রয়োজন নেই তবে আপনার এটি নিয়ে চিন্তা করার দরকার নেই।