中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

__slots__關鍵字究竟是做什么的呢

發布時間:2020-07-02 11:46:14 來源:億速云 閱讀:163 作者:清晨 欄目:編程語言

這篇文章將為大家詳細講解有關__slots__關鍵字究竟是做什么的呢,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

如果你看過github當中一些大牛的代碼,你會發現很多大牛經常在類的頂部加上__slots__關鍵字。如果你足夠好奇,你可能會試著把這個關鍵字去掉再運行試試,你會發現去掉了之后什么也沒有發生,一切依然運行得很好。

那么這個__slots__關鍵字究竟是做什么的呢?

它主要有兩個功能,我們先來說第一個功能,就是限制用戶的使用

我們都知道Python是一門非常靈活的動態語言,很多在其他語言看起來完全不能容忍的事情在Python當中是可行的,這也是Python的設計理念,為了靈活和代碼方便犧牲了效率。比如我們來看一個很簡單的例子,由于Python是動態語言,所以類的成員甚至可以在類創建好了之后動態創建。這在靜態語言當中是絕對不行的,我們只能調用類當中已有的屬性,是不能或者很難添加新屬性的。

比如這段代碼:

class Exp:
    def __init__(self):
        self.a = None
        self.b = None


if __name__ == "__main__":
    exp = Exp()
    exp.c = 3
    print(exp.c)

我們定義了一個類叫做Exp,我們為它創建了a和b兩個成員。但是我們在使用的時候,對c成員進行了賦值。要知道Exp類當中是沒有成員c的,但是程序并不會報錯,我們這么運行了之后它會將c添加進這個實例當中。

從一方面來看,這當然非常靈活,但是另一方面,這也留下了隱患。如果用戶隨意添加屬性,可能會導致未知的問題,尤其在復雜的系統當中。所以有些時候為了嚴謹,我們會不希望用戶做這種動態的修改。__slots__正是用來做這個的。

我們把這個關鍵字加上,再來運行結果就不一樣了:

class Exp:

    __slots__ = ['a', 'b']
    def __init__(self):
        self.a = None
        self.b = None


if __name__ == "__main__":
    exp = Exp()
    exp.c = 3
    print(exp.c)

如果你運行這段代碼的話,你會得到一個報錯,提示你Exp這個對象當中并沒有c這個成員,也就是說我們只能運用__slots__這個關鍵字當中定義的成員,對于沒有定義的成員不能隨意創建,這樣就限制了用戶的使用。

雖然現在大部分人使用這個關鍵字都是報著這個目的,但是很遺憾的是,Python創建者的初衷其實并不是這個。這就談到了__slots__關鍵字的第二個作用,就是節省內存

如果了解過Python底層的實現原理,你會發現在Python當中為每一個實例都創建了一個字典,就是大名鼎鼎的__dict__字典。正是因為背后有一個字典,所以我們才可以創造出原本不存在的成員,也才支持這樣動態的效果。我們可以人工地調用這個字典輸出其中的內容,我們在加上__slots__關鍵字之前,輸出的結果是這樣的:

{'a': None, 'b': None}

但是加上了這個關鍵字之后,會得到一個報錯,會告訴你Exp這個對象當中沒有__dict__這個成員。原因很簡單,因為使用dict來維護實例,會消耗大量的內存,額外存儲了許多數據,而使用__slots__之后,Python內部將不再為實例創建一個字典來維護,而是會使用一個固定大小的數組,這樣就節省了大量的空間。

這個節省可不是一點半點,一般可以節省一半以上。也就是說犧牲了一定的靈活性,保證了性能。這一點也是__slots__這個關鍵字設計的初衷,但是現在很多人都用錯了地方。


關于__slots__關鍵字究竟是做什么的呢就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荣成市| 泊头市| 雷山县| 合肥市| 汪清县| 通化县| 封丘县| 大邑县| 内乡县| 潜江市| 海安县| 龙里县| 垫江县| 梨树县| 安康市| 西乌珠穆沁旗| 中江县| 海城市| 东方市| 齐河县| 荣昌县| 鹿泉市| 同江市| 龙口市| 武陟县| 齐齐哈尔市| 郧西县| 黄山市| 土默特左旗| 鄂伦春自治旗| 宜宾县| 新建县| 拜泉县| 阳城县| 桐梓县| 安福县| 香河县| 遂平县| 延安市| 松溪县| 凤冈县|