Pickle some parts of object
ใน Python มีกระบวนการอย่างหนึ่งเรียกว่า pickle ซึ่งใช้ในการแปลงข้อมูลจาก object ไปเป็นข้อความเพื่อนำไปเก็บหรือส่งข้อความนั้นข้ามระบบแล้วแปลงข้อมูลจากข้อความกลับมาเป็น object ใหม่
>>> a = {'k1':'v1', 'k2':'v2', 'k3':[1,5,3,4]}
>>> import pickle
>>> s = pickle.dumps(a)
>>> s
"(dp0\nS'k3'\np1\n(lp2\nI1\naI5\naI3\naI4\nasS'k2'\np3\nS'v2'\np4\nsS'k1'\np5\nS'v1'\np6\ns."
>>> b = pickle.loads(s)
>>> b
{'k3': [1, 5, 3, 4], 'k2': 'v2', 'k1': 'v1'}
แล้วเกิดสมมติว่าเรามี object แบบนี้
class kls:
def __init__(self):
self.hello = ''
self.b = 'b'
self.c = 'this is c'
self._d = 'this is d'
โดยที่เราไม่อยากให้ pickle เอา d ไปด้วย วิธีง่ายๆคือให้ override __getstate__ เท่านั้นเอง
def __getstate__(self):
odict = self.__dict__.copy() # Copy because we want to modify the clone, not the source
del odict['_d']
return odict
ส่วนเวลาเอากลับมาก็ override __setstate__
def __setstate__(self, dict):
self.__dict__.update(dict) # update attributes
self._d = 'this is d'
ซึ่งในขั้นนี้ เราอาจจะทำการคำนวณค่าต่างๆเช่น _d กลับมาอีกรอบก็ได้ สำหรับรายละเอียด สามารถอ่านได้จากเอกสารเกี่ยวกับ Pickle

Comments
ยังไม่ค่อยเข้าใจเท่าไหร่ว่ามีกรณีไหนบ้างที่ไม่อยากให้ d ติดไปด้วยอ่ะครับ ?
พวก property ที่เป็น derive value ไง หรือว่าพวกที่เป็น cache ทั้งหลาย เพราะที่ทำนี่คือจะได้ประหยัด ๆ ทั้งข้อมูลที่เก็บใน session ทั้งใน db อะ
พอจะเห็นภาพใช่ป่าว
นึกออกแล้วครับ เหมือนเวลาเก็บวันเกิดแต่ไม่อยากเก็บอายุใช่ม๊าา (ผมเป็นเด็กเข้าใจง่าย) :D
เข้าใจว่าเหมือน serialize กับ unserialize ใน PHP
Post new comment