CodeGym /์ž๋ฐ” ์ฝ”์Šค /Python SELF KO /์ง๋ ฌํ™” ๊ด€๋ฆฌ

์ง๋ ฌํ™” ๊ด€๋ฆฌ

Python SELF KO
๋ ˆ๋ฒจ 22 , ๋ ˆ์Šจ 2
์‚ฌ์šฉ ๊ฐ€๋Šฅ

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__() ๋ฉ”์†Œ๋“œ์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ด:

  1. ํ˜„์žฌ ๊ฐ์ฒด ์ƒํƒœ(๋‚ด๋ถ€ ํ•„๋“œ __dict__๋กœ ์„ค์ •๋œ ๊ฒƒ์„) ๋ณ„๋„์˜ ๋ณ€์ˆ˜ - ๋”•์…”๋„ˆ๋ฆฌ state์— ๋ณต์‚ฌํ•ด.
  2. ์ €์žฅํ•˜์ง€ ์•Š์„ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•ด.
  3. __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__() ํ•จ์ˆ˜์—์„œ ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด:

  1. update() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด.
  2. ํ•„๋“œ internal_state (๋ฐ ๋‹ค๋ฅธ ๋น„์ง๋ ฌํ™” ํ•„๋“œ)์— ์ƒˆ ๊ฐ’์„ ํ• ๋‹นํ•ด.
1
ะžะฟั€ะพั
๋””๋ ‰ํ† ๋ฆฌ ์ž‘์—…,ย  22 ัƒั€ะพะฒะตะฝัŒ,ย  2 ะปะตะบั†ะธั
ะฝะตะดะพัั‚ัƒะฟะตะฝ
๋””๋ ‰ํ† ๋ฆฌ ์ž‘์—…
๋””๋ ‰ํ† ๋ฆฌ ์ž‘์—…
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION