激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python pickle類(lèi)庫(kù)介紹(對(duì)象序列化和反序列化)

Python pickle類(lèi)庫(kù)介紹(對(duì)象序列化和反序列化)

2020-05-14 09:32腳本之家 Python

這篇文章主要介紹了Python pickle類(lèi)庫(kù)介紹(對(duì)象序列化和反序列化),本文講解了pickle庫(kù)的作用、pickle的運(yùn)行過(guò)程、使用實(shí)例、修改picklable類(lèi)型的默認(rèn)行為等內(nèi)容,需要的朋友可以參考下

一、pickle

pickle模塊用來(lái)實(shí)現(xiàn)python對(duì)象的序列化和反序列化。通常地pickle將python對(duì)象序列化為二進(jìn)制流或文件。
 
python對(duì)象與文件之間的序列化和反序列化:

復(fù)制代碼 代碼如下:

pickle.dump()
pickle.load()


如果要實(shí)現(xiàn)python對(duì)象和字符串間的序列化和反序列化,則使用:

復(fù)制代碼 代碼如下:

pickle.dumps()
pickle.loads()


 
可以被序列化的類(lèi)型有:
* None,True 和 False;
* 整數(shù),浮點(diǎn)數(shù),復(fù)數(shù);
* 字符串,字節(jié)流,字節(jié)數(shù)組;
* 包含可pickle對(duì)象的tuples,lists,sets和dictionaries;
* 定義在module頂層的函數(shù):
* 定義在module頂層的內(nèi)置函數(shù);
* 定義在module頂層的類(lèi);
* 擁有__dict__()或__setstate__()的自定義類(lèi)型;
 

 

注意:對(duì)于函數(shù)或類(lèi)的序列化是以名字來(lái)識(shí)別的,所以需要import相應(yīng)的module。

二、pickle的運(yùn)行過(guò)程

在大部分情況下,要是的對(duì)象picklable,我們不需要額外的代碼。默認(rèn)地pickle將智能地檢查類(lèi)和實(shí)例的屬性,當(dāng)一個(gè)類(lèi)實(shí)例反序列化的時(shí)候,它的__init__()方法通常不被調(diào)用。而是首先創(chuàng)建一個(gè)未初始化的實(shí)例,然后再回復(fù)存儲(chǔ)的屬性。
 

但是可以通過(guò)實(shí)現(xiàn)下列的方法來(lái)修改默認(rèn)的行為:

復(fù)制代碼 代碼如下:

object.__getstate__() :默認(rèn)地序列化對(duì)象的__dict__,但是如果你實(shí)現(xiàn)了__getstate__(),則__getstate__()函數(shù)返回的值將被序列化。
object.__setstate__(state) :如果類(lèi)型實(shí)現(xiàn)了此方法,則在反序列化的時(shí)候,此方法用來(lái)恢復(fù)對(duì)象的屬性。
object.__getnewargs__() : 如果實(shí)例構(gòu)造的時(shí)候(__new__())需要參數(shù),則需要實(shí)現(xiàn)此函數(shù)。


注意:如果__getstate__()返回False,則在反序列化的時(shí)候__setstate__()則不被調(diào)用。

 

有的時(shí)候?yàn)榱诵剩蛏厦娴?個(gè)函數(shù)不能滿(mǎn)足需求時(shí),需要實(shí)現(xiàn)__reduce__()函數(shù)。

三、實(shí)例

 

復(fù)制代碼 代碼如下:


import pickle

 

# An arbitrary collection of objects supported by pickle.
data = {
    'a': [1, 2.0, 3, 4+6j],
    'b': ("character string", b"byte string"),
    'c': set([None, True, False])
}

with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)

   
with open('data.pickle', 'rb') as f:
    # The protocol version used is detected automatically, so we do not
    # have to specify it.
    data = pickle.load(f)
    print(str(data))

 

四、修改picklable類(lèi)型的默認(rèn)行為  

 

復(fù)制代碼 代碼如下:


class TextReader:
    """Print and number lines in a text file."""

 

    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename)
        self.lineno = 0

    def readline(self):
        self.lineno += 1
        line = self.file.readline()
        if not line:
            return None
        if line.endswith('\n'):
            line = line[:-1]
        return "%i: %s" % (self.lineno, line)

    def __getstate__(self):
        # Copy the object's state from self.__dict__ which contains
        # all our instance attributes. Always use the dict.copy()
        # method to avoid modifying the original state.
        state = self.__dict__.copy()
        # Remove the unpicklable entries.
        del state['file']
        return state

    def __setstate__(self, state):
        # Restore instance attributes (i.e., filename and lineno).
        self.__dict__.update(state)
        # Restore the previously opened file's state. To do so, we need to
        # reopen it and read from it until the line count is restored.
        file = open(self.filename)
        for _ in range(self.lineno):
            file.readline()
        # Finally, save the file.
        self.file = file
       
reader = TextReader("hello.txt")
print(reader.readline())
print(reader.readline())
s = pickle.dumps(reader)
#print(s)
new_reader = pickle.loads(s)
print(new_reader.readline())

# the output is
# 1: hello
# 2: how are you
# 3: goodbye


延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 在线观看日本中文字幕 | 国产一级毛片a | av观看国产 | 亚洲影视中文字幕 | 蜜桃视频日韩 | 黄色免费不卡视频 | 国产成人综合在线视频 | 91女上位 在线播放 bt 自拍 另类 综合 欧美 | 国产精品一区二区免费在线观看 | 亚洲精品久久久久www | 永久av在线免费观看 | 欧美韩国一区 | 黄wwww| 九色成人在线 | 中文字幕在线观看视频www | 看一级大毛片 | 国产亚洲综合精品 | 一级毛片在线视频 | 欧美日韩成人一区二区 | 媚药按摩痉挛w中文字幕 | 天天操天天插天天干 | 亚洲午夜电影 | 免费观看黄视频 | www.99久 | 我爱我色成人网 | 欧美日韩亚洲不卡 | 成人影片在线免费观看 | 在线成人一区二区 | 国产一区二区午夜 | a视频在线免费观看 | 免费在线观看毛片视频 | 国产精品看片 | 国产午夜精品视频免费不卡69堂 | 久久久麻豆| 国产精品视频海角社区88 | 91短视频版高清在线观看免费 | 在线免费观看麻豆 | 黄色一级视频 | 欧美一区二区三区久久 | 本站只有精品 | 久草免费资源视频 |