__setstate__ 및 __getstate__ 사용의 간단한 예
__setstate__
및 __getstate__
메서드가 무엇을하는지 모르겠 으므로 간단한 예를 들어 도와주세요.
다음은 pickle 문서를 보완해야하는 Python 2에 대한 매우 간단한 예제입니다 .
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:", d
self.__dict__ = d
self.val *= 3
import pickle
f = Foo()
f_string = pickle.dumps(f)
f_new = pickle.loads(f_string)
최소한의 예
어쨌든 나오는 getstate
로 간다 setstate
. dict 일 필요는 없습니다.
무엇이든 나오는 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__
은 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__
기본 get 및 set에는 튜플이 필요합니다.
기본을 다시 사용하려는 경우 __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
Unfortunately it is not possible to reuse the default __getstate__
and __setstate__
of the base: https://groups.google.com/forum/#!topic/python-ideas/QkvOwa1-pHQ we are forced to define them.
Tested on Python 2.7.12. GitHub upstream.
These methods are used for controlling how objects are pickled and unpickled by the pickle module. This is usually handled automatically, so unless you need to override how a class is pickled or unpickled you shouldn't need to worry about it.
참고URL : https://stackoverflow.com/questions/1939058/simple-example-of-use-of-setstate-and-getstate
'Development Tip' 카테고리의 다른 글
C ++의 헤더 파일에 함수 정의 작성 (0) | 2020.12.01 |
---|---|
document.cookie에 사이트의 모든 쿠키가 표시되지 않는 이유는 무엇입니까? (0) | 2020.12.01 |
Android의 Parcelable 및 상속 (0) | 2020.12.01 |
목록 이해력을 사용하여 튜플 작성 (0) | 2020.12.01 |
Kubernetes (kubectl)에 사용자를 추가하는 방법은 무엇입니까? (0) | 2020.12.01 |