亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python?魔法方法之?__?slots?__的實現

 更新時間:2023年03月01日 08:34:19   作者:go&Python  
本文主要介紹了python?魔法方法之?__?slots?__的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

__ slots __

__slots__是python class的一個特殊attribute,能夠節(jié)省內存空間。正常情況下,一個類的屬性是以字典的形式來管理, 每個類都會有__ dict__ 方法。但是我們可以通過 設置 __ slots__ 來將類的屬性構造成一個靜態(tài)的數據結構來管理,里面存儲的是 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
'''

優(yōu)點:

  • 節(jié)約內存,不用去定義動態(tài)數據接口 __ dict__ 的內存, __ weakref__ 也不用去申請
  • access attributes 更快,靜態(tài)數據結構,比__ dict__ 更快

缺點:

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

在這里插入圖片描述

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

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

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

當你事先知道class的attributes的時候,建議使用slots來節(jié)省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 __內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • DataFrame里的replace替換方式

    DataFrame里的replace替換方式

    這篇文章主要介紹了DataFrame里的replace替換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python圖像處理利Pillow庫使用實戰(zhàn)指南

    Python圖像處理利Pillow庫使用實戰(zhàn)指南

    Pillow庫是Python編程中用于圖像處理的重要工具,作為Python?Imaging?Library(PIL)的一個分支,Pillow庫提供了豐富的功能和易用的API,用于處理圖像的各種操作
    2023-12-12
  • 基于Python-Pycharm實現的猴子摘桃小游戲(源代碼)

    基于Python-Pycharm實現的猴子摘桃小游戲(源代碼)

    這篇文章主要介紹了基于Python-Pycharm實現的猴子摘桃小游戲,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Python中三元表達式的幾種寫法介紹

    Python中三元表達式的幾種寫法介紹

    今天小編就為大家分享一篇關于Python中三元表達式的幾種寫法介紹,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • PHP魔術方法__ISSET、__UNSET使用實例

    PHP魔術方法__ISSET、__UNSET使用實例

    這篇文章主要介紹了PHP魔術方法__ISSET、__UNSET使用實例,本文直接給出代碼示例,需要的朋友可以參考下
    2014-11-11
  • python 如何在 Matplotlib 中繪制垂直線

    python 如何在 Matplotlib 中繪制垂直線

    這篇文章主要介紹了python 如何在 Matplotlib 中繪制垂直線,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-04-04
  • 使用Python?matplotlib繪制簡單的柱形圖、折線圖和直線圖

    使用Python?matplotlib繪制簡單的柱形圖、折線圖和直線圖

    Matplotlib是Python的繪圖庫, 它可與NumPy一起使用,提供了一種有效的MatLab開源替代方案,下面這篇文章主要給大家介紹了關于使用Python?matplotlib繪制簡單的柱形圖、折線圖和直線圖的相關資料,需要的朋友可以參考下
    2022-08-08
  • Python手動實現Hough圓變換的示例代碼

    Python手動實現Hough圓變換的示例代碼

    Hough圓變換的原理相信大家都非常清楚了,但是手動實現的比較少。這篇文章將為大家介紹手動實現Hough圓變換的示例代碼,需要的可以了解一下
    2022-01-01
  • Seaborn數據分析NBA球員信息數據集

    Seaborn數據分析NBA球員信息數據集

    這篇文章主要為大家介紹了Seaborn數據分析處理NBA球員信息數據集案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 初學python數學建模之數據導入(小白篇)

    初學python數學建模之數據導入(小白篇)

    本篇文章是小白篇初學python的同學可以來共同學習了,本篇文章主要講解了python數學建模過程中的第一步數據導入,數據導入是所有數模編程的第一步,比你想象的更重要
    2021-08-08

最新評論