91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

python魔法方法?__?slots?__怎么使用

發布時間:2023-03-01 09:56:10 來源:億速云 閱讀:137 作者:iii 欄目:開發技術

這篇文章主要講解了“python魔法方法 __ slots __怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python魔法方法 __ slots __怎么使用”吧!

__ slots __

__slots__是python class的一個特殊attribute,能夠節省內存空間。正常情況下,一個類的屬性是以字典的形式來管理, 每個類都會有__ dict__ 方法。但是我們可以通過 設置 __ slots__ 來將類的屬性構造成一個靜態的數據結構來管理,里面存儲的是 value references。

class Bar(object):
    def __init__(self, a):
        self.a = a


class BarSlotted(object):
    __slots__ = "a",

    def __init__(self, a):
        self.a = a


# create class instance
bar = Bar(1)
bar_slotted = BarSlotted(1)

print(set(dir(bar)) - set(dir(bar_slotted)))
# {'__dict__', '__weakref__'}   
'''
使用 __slots__ 后, 類里面會減少 __dict__  __weakref__ 兩個方法。
__weakref__  --- 弱引用  詳情鏈接 https://docs.python.org/zh-cn/3/library/weakref.html
'''

優點:

  • 節約內存,不用去定義動態數據接口 __ dict__ 的內存, __ weakref__ 也不用去申請

  • access attributes 更快,靜態數據結構,比__ dict__ 更快

缺點:

定義死后,不能去申請新的屬性,申請會報屬性錯誤

python魔法方法?__?slots?__怎么使用

可以通過 把 __ dict__ 作為 __ slots__ 的一個屬性,實現既能通過定義__ slots__ 節約內存,又實現新屬性的定義。

class BarSlotted(object):
    __slots__ = "a",'__dict__'

    def __init__(self, a):
        self.a = a
        
bar_slotted = BarSlotted(1)
bar_slotted.b = "111"

當你事先知道class的attributes的時候,建議使用slots來節省memory以及獲得更快的attribute access。

注意不應當用來限制__slots__之外的新屬性作為使用__slots__的原因,可以使用裝飾器以及反射的方式來實現屬性控制。

注意事項

子類會繼承父類的 __ slots__

class Parent(object):
    __slots__ = "x", "y"


class Child(Parent):
    __slots__ = "z",
    # 重復的 x, y 可以不寫,
    # __slots__ = "x", "y", "z"


child = Child()
print(dir(child)) 
# [..., 'x', 'y', 'z']

不支持多繼承, 會直接報錯

class ParentA(object):
    __slots__ = "x",


class ParentB(object):
    __slots__ = "y",


class Child(ParentA, ParentB):
    pass

'''
Traceback (most recent call last):
  File "C:/Users/15284/PycharmProjects/pythonProject/test.py", line 69, in <module>
    class Child(ParentA, ParentB):
TypeError: multiple bases have instance lay-out conflict
'''

只允許父類中有一方設定了 __ slots__

class AbstractA(object):
  __slots__ = ()

class AbstractB(object):
  __slots__ = "x"

class Child(AbstractA, AbstractB):
  __slots__ = "x", "y"

新版本的 pickle中的 pickle含有slotted class,使用時需要注意。

感謝各位的閱讀,以上就是“python魔法方法 __ slots __怎么使用”的內容了,經過本文的學習后,相信大家對python魔法方法 __ slots __怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

吴堡县| 长寿区| 临猗县| 仪陇县| 凤庆县| 江津市| 抚顺县| 康定县| 忻州市| 晋江市| 富蕴县| 宝山区| 绥宁县| 子长县| 临潭县| 棋牌| 鄂尔多斯市| 华亭县| 灌南县| 灵武市| 山阳县| 洪雅县| 香格里拉县| 巨鹿县| 大同县| 渭源县| 五指山市| 石柱| 北流市| 淄博市| 隆德县| 友谊县| 云南省| 万全县| 石门县| 景宁| 逊克县| 湘阴县| 云林县| 集贤县| 桑植县|