以下にあるクラスについてどうやって picklle 化の振る舞いを変更 するかのれいを示します。TextReader クラスはファイルを開き、 readline() メソッドが呼ばれるたびに行番号と行の内容を 返します。TextReader インスタンスが pickle 化された場合、 ファイルオブジェクト 以外の 全ての属性が保存されます。 インスタンスが unpickle 化された際、ファイルは再度開かれ、 以前のファイル位置から読み出しを再開します。上記の動作を 実装するために、__setstat__() および __getstate__() メソッドが使われています。
class TextReader:
"""Print and number lines in a text file."""
def __init__(self, file):
self.file = file
self.fh = open(file)
self.lineno = 0
def readline(self):
self.lineno = self.lineno + 1
line = self.fh.readline()
if not line:
return None
if line.endswith("\n"):
line = line[:-1]
return "%d: %s" % (self.lineno, line)
def __getstate__(self):
odict = self.__dict__.copy() # copy the dict since we change it
del odict['fh'] # remove filehandle entry
return odict
def __setstate__(self,dict):
fh = open(dict['file']) # reopen file
count = dict['lineno'] # read from file...
while count: # until line count is restored
fh.readline()
count = count - 1
self.__dict__.update(dict) # update attributes
self.fh = fh # save the file object
使用例は以下のようになるでしょう:
>>> import TextReader
>>> obj = TextReader.TextReader("TextReader.py")
>>> obj.readline()
'1: #!/usr/local/bin/python'
>>> # (more invocations of obj.readline() here)
... obj.readline()
'7: class TextReader:'
>>> import pickle
>>> pickle.dump(obj,open('save.p','w'))
pickle が Python プロセス間でうまく働くことを見たい なら、先に進む前に他の Python セッションを開始してください。 以下の振る舞いは同じプロセスでも新たなプロセスでも起こります。
>>> import pickle
>>> reader = pickle.load(open('save.p'))
>>> reader.readline()
'8: "Print and number lines in a text file."'
参考資料:
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。