10.1 ๋ค ๋ด ๋ฐฉ์๋๋ก ํ ๊ฑฐ์ผ!
๋๋๋ก ๊ฐ์ฒด์ ์ฌ๋ฌ ๋ค๋ฅธ ์๋น์ค ๊ฐ์ฒด์ ๋ํ ๋ง์ ์ฐธ์กฐ๊ฐ ์ ์ฅ๋์ด ์์ ์ ์์ด. ์ด๋ฐ ์ฐธ์กฐ๋ค์ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ๊ณ ์ถ์ง ์๊ฑฐ๋ ์ ์กํ ์ ์๋ ๊ฒ๋ค์ด์ผ: ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ์ ๋ํ ์ฐธ์กฐ๋ค.
์ด๋ ๊ฒ ์ง๋ ฌํ๊ฐ ์๋ํ๋๋ก ํ๋ ค๋ฉด ํด๋์ค๊ฐ ์ค์ค๋ก ์ง๋ ฌํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฃผ๊ธฐ๋ก ํ์ด.
์ด๋ฅผ ์ํด ํน๋ณํ ๋ฉ์๋๋ค์ด ์ฌ์ฉ๋ผ: __reduce__()
,
__getstate__()
, __setstate__()
. ์ด ๋ฉ์๋๋ค์ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ์ง๋ ฌํ๋๊ณ
๋ณต์๋์ด์ผ ํ๋์ง๋ฅผ ์ง์ ํ ์ ์๊ฒ ํด์ค.
์ฃผ์ ๊ด๋ฆฌ ์ง๋ ฌํ ๋ฉ์๋:
-
__reduce__()
: ๊ฐ์ฒด๊ฐ ์ง๋ ฌํ๋๋ ๋ฐฉ์์ ์ง์ ํด. -
__getstate__()
: ์ง๋ ฌํ๋ฅผ ์ํ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ฐํํด. -
__setstate__(self, state)
: ์ํ์์ ๊ฐ์ฒด๋ฅผ ๋ณต์ํด.
์๋์์ ๋ ์์ธํ ์ค๋ช ํ๊ณ , ์ด๋ค์ ์ด๋ป๊ฒ ํจ๊ป ์ฌ์ฉํ๋์ง ๋ณด์ฌ์ค๊ฒ.
10.2 ๋ฉ์๋ __reduce__()
๋ฉ์๋ __reduce__()
๋ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ์ง๋ ฌํ๋๊ณ
์ญ์ง๋ ฌํ๋์ด์ผ ํ๋์ง๋ฅผ ๋ํ๋ด๋ ํํ์ ๋ฐํํด. ํํ์๋ ๋ณดํต ๋ค์์ด ํฌํจ๋์ด:
- ๊ฐ์ฒด๋ฅผ ๋ณต์ํ๋ ๋ฐ ์ฌ์ฉํ ํจ์๋ ํด๋์ค์ ๋ํ ์ฐธ์กฐ.
- ์ด ํจ์๋ ํด๋์ค์ ๋ํ ์ธ์์ ํํ.
- ๊ฐ์ฒด์ ์ถ๊ฐ์ ์ธ ์ํ (ํ์ํ ๊ฒฝ์ฐ).
์์:
import pickle
class CustomClass:
def __init__(self, value):
self.value = value
def __reduce__(self):
return (self.__class__, (self.value,))
def __repr__(self):
return f"CustomClass(value={self.value})"
# ๊ฐ์ฒด ์์ฑ
obj = CustomClass(42)
# ๊ฐ์ฒด ์ง๋ ฌํ
serialized_obj = pickle.dumps(obj)
print("์ง๋ ฌํ๋ ๊ฐ์ฒด:", serialized_obj)
# ๊ฐ์ฒด ์ญ์ง๋ ฌํ
deserialized_obj = pickle.loads(serialized_obj)
print("์ญ์ง๋ ฌํ๋ ๊ฐ์ฒด:", deserialized_obj)
๊ธฐ๋ณธ์ ์ผ๋ก __reduce__()
ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ๋์์ ํด:
class CustomClass:
def __init__(self, value):
self.value = value
def __reduce__(self):
# ํด๋์ค ์ ์
cls = self.__class__
# ์์ฑ์ ์ธ์
args = (self.value,)
# ๊ฐ์ฒด ์ํ
state = self.__dict__
return (cls, args, state)
์ธ ๊ฐ์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ํํ์ ๋ฐํํด:
ํ์ฌ ํด๋์ค์ ๋ํ ์ฐธ์กฐ
์์ฑ์ ์ธ์ (ํํ)
ํ์ฌ ๊ฐ์ฒด ์ํ์ ๋ํ ์ฐธ์กฐ
๋ง์ฝ ์ด๋ฐ ๋์์ด ๋น์ ์ ์๊ตฌ์ฌํญ์ ๋ง๋ค๋ฉด __reduce__()
๋ฅผ ์ฌ์ ์ํ์ง ์์๋ ๋ผ.
10.3 ์ํ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ
๋ฉ์๋ __getstate__()
๋ฐ
__setstate__()
์ด ๋ฉ์๋๋ค์ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ ๋์ ๊ฐ์ฒด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ผ.
-
__getstate__()
: ์ง๋ ฌํํ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ฐํํด. -
__setstate__(self, state)
: ์ํ์์ ๊ฐ์ฒด๋ฅผ ๋ณต์ํด.
์์:
๋ชจ๋ ๊ฐ์ฒด ํ๋๋ฅผ ์ ์ฅํ์ง ์๊ณ ๋ช๋ช ํ๋๋ฅผ ์ ์ธํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด ๊ฒฝ์ฐ __getstate__()
๋ฉ์๋์์ ๋ค์์ ์ํํด์ผ ํด:
-
ํ์ฌ ๊ฐ์ฒด ์ํ(๋ด๋ถ ํ๋
__dict__
๋ก ์ค์ ๋ ๊ฒ์) ๋ณ๋์ ๋ณ์ - ๋์ ๋๋ฆฌstate
์ ๋ณต์ฌํด. - ์ ์ฅํ์ง ์์ ๋ชจ๋ ํ๋๋ฅผ ์ญ์ ํด.
__getstate__()
ํจ์์ ๊ฒฐ๊ณผ๋ก ์ป์ ๊ฐ์ฒด๋ฅผ ๋ฐํํด.
import pickle
class CustomClass:
def __init__(self, value):
self.value = value
self.internal_state = "internal"
def __getstate__(self):
state = self.__dict__.copy()
del state['internal_state'] # ๋ด๋ถ ์ํ ์ ์ธ
return state
def __setstate__(self, state):
self.__dict__.update(state)
self.internal_state = "restored internal" # ๋ด๋ถ ์ํ ๋ณต์
def __repr__(self):
return f"CustomClass(value={self.value}, internal_state={self.internal_state})"
# ๊ฐ์ฒด ์์ฑ
obj = CustomClass(42)
print("์๋ณธ ๊ฐ์ฒด:", obj)
# ๊ฐ์ฒด ์ง๋ ฌํ
serialized_obj = pickle.dumps(obj)
print("์ง๋ ฌํ๋ ๊ฐ์ฒด:", serialized_obj)
# ๊ฐ์ฒด ์ญ์ง๋ ฌํ
deserialized_obj = pickle.loads(serialized_obj)
print("์ญ์ง๋ ฌํ๋ ๊ฐ์ฒด:", deserialized_obj)
์ญ์ง๋ ฌํ ์, __setstate__()
ํจ์์์ ๋ ๊ฐ์ง ์์
์ ์ํํด:
-
update()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๊ฐ์ฒด ์ํ๋ฅผ ์ ๋ฐ์ดํธํด. -
ํ๋
internal_state
(๋ฐ ๋ค๋ฅธ ๋น์ง๋ ฌํ ํ๋)์ ์ ๊ฐ์ ํ ๋นํด.
GO TO FULL VERSION