最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中__slots__屬性介紹與基本使用方法

 更新時間:2018年09月05日 08:27:45   作者:嚴(yán)北  
在Python中,每個類都有實例屬性。默認(rèn)情況下Python用一個字典來保存一個對象的實例屬性。這非常有用,因為它允許我們在運行時去設(shè)置任意的新屬性。下面這篇文章主要給大家介紹了關(guān)于Python中__slots__屬性與基本使用方法的相關(guān)資料,需要的朋友可以參考下

簡介

在廖雪峰的python網(wǎng)站上,他是這么說的

python是動態(tài)語言,它允許程序在執(zhí)行過程中動態(tài)綁定屬性或者方法(使用MethodTpye)。

某個實例在執(zhí)行過程中綁定的屬性跟方法,僅在該實例中有效,其他同類實例是沒有的。

可以通過給class綁定屬性/方法,來給所有實例綁定屬性/方法:

Student.name = ''
Student.set_score = set_score

而如果使用__slots__,它僅允許動態(tài)綁定()里面有的屬性

例如,下面這樣會報錯

class Student():
__slots__ = ('name', 'age')

S1 = Student()
S1.name = 'Jack' # ok!
S1.score = 123 # error!

但是我覺得很奇怪,僅有這一個作用嗎?于是我再查了其他資料,發(fā)現(xiàn)這個函數(shù)可以很可觀地節(jié)約內(nèi)存,下面來一起看看詳細(xì)的介紹吧。

__slots__允許我們聲明并限定類成員,并拒絕類創(chuàng)建__dict__和__weakref__屬性以節(jié)約內(nèi)存空間。

Python是動態(tài)語言,對于普通的類,可以為類實例賦值任何屬性,這些屬性會存儲在__dict__中:

>>> class Student(object):
... pass
... 
>>> Abey = Student()
>>> Abey.name = 'Abey'
>>> Abey.__dict__
{'name': 'Abey'}

這樣的特性帶來兩個問題:

  • 數(shù)據(jù)通過字典(Hash)存儲所占用的空間較大
  • 如何禁止隨意生成類屬性

當(dāng)然,__slots__就能解決這兩個問題。通過__slots__屬性限定類屬性的創(chuàng)建:

>>> class Student(object):
... __slots__ = ('name', 'age')
... 
>>> Abey = Student()
>>> Abey.name = 'Abey'
>>> Abey.gender = 'Female'
Traceback (most recent call last):
 File "<input>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'gender'
>>> Abey.__dict__
Traceback (most recent call last):
 File "<input>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__dict__'

可以看到,在定義了__slots__變量后,Student類實例已經(jīng)不能隨意創(chuàng)建不在__slots__定義內(nèi)的屬性gender,同時實例中也不再有__dict__結(jié)構(gòu)。

用法

繼承樹

__slots__在繼承中有兩種表現(xiàn):

  • 子類未聲明__slots__時,不繼承父類的__slots__,即此時子類實例可以隨意賦值屬性
  • 子類聲明__slots__時,繼承父類的__slots__,即此時子類的__slots__為其自身+父類的__slots__

以下面的父類為例:

>>> class Student(object):
... __slots__ = ('name', 'age')
... 

創(chuàng)建一個子類不聲明__slots__,該類實例可以創(chuàng)建父類__slots__限定之外的屬性gender:

>>> class SubStudent(Student):
... pass
... 
>>> Bob = SubStudent()
>>> Bob.gender = 'Male'
>>> Bob.__dict__
{'gender': 'Male'}

而創(chuàng)建一個聲明__slots__的子類,該類屬性則只能創(chuàng)建父類__slots__+自身__slots__限定的屬性:

>>> class SubStudent2(Student):
... __slots__ = 'gender'
... 
>>> Cathy = SubStudent2()
>>> Cathy.gender = 'Female'
>>> Cathy.name = 'Cathy'
>>> Cathy.teacher = 'Mrs. Wang'
Traceback (most recent call last):
 File "<input>", line 1, in <module>
AttributeError: 'SubStudent2' object has no attribute 'teacher'

注意:子類的__slots__本身已經(jīng)繼承自父類,無需重復(fù)聲明父類已聲明的屬性。例如上例,重復(fù)聲明會多占用內(nèi)存空間:

>>> class SubStudent3(Student):
... __slots__ = ('name', 'age', 'gender')
... 
>>> from sys import getsizeof
>>> getsizeof(Student()), getsizeof(SubStudent2()), getsizeof(SubStudent3())
(56, 64, 80)

性能對比

我們?yōu)槭裁匆褂胈_slots__呢?

更快速地賦值屬性

參考Stack Overflow回答中給出的數(shù)據(jù):

import timeit

class Foo(object): __slots__ = 'foo',

class Bar(object): pass

slotted = Foo()
not_slotted = Bar()

def get_set_delete_fn(obj):
 def get_set_delete():
 obj.foo = 'foo'
 obj.foo
 del obj.foo
 return get_set_delete

得到測試結(jié)果為:

>>> min(timeit.repeat(get_set_delete_fn(slotted)))
0.2846834529991611
>>> min(timeit.repeat(get_set_delete_fn(not_slotted)))
0.3664822799983085

可以看到,在相同的環(huán)境(Ubuntu)下,slots為Python3.5帶來了接近30%的賦值速度提升:

節(jié)約內(nèi)存空間

>>> 0.3664822799983085 / 0.2846834529991611
1.2873325658284342

由于不使用__dict__存儲對象的屬性,__slots__在一些場景下能夠節(jié)約極大的內(nèi)存空間。具體數(shù)據(jù)可以查看參考中的回答鏈接,不贅述。

參考

[1] Usage of __slots__? ,  Aaron Hall, Stack Overflow

推薦閱讀

[1] Data model , Python Document

[2] python __slots__ 使你的代碼更加節(jié)省內(nèi)存 , david_bj, 51CTO

[3] 使用__slots__ , 廖雪峰

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Pandas提取含有指定字符串的行(完全匹配,部分匹配)

    Pandas提取含有指定字符串的行(完全匹配,部分匹配)

    本文主要介紹了Pandas提取含有指定字符串的行(完全匹配,部分匹配),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python 中open文件路徑的選擇問題解析

    python 中open文件路徑的選擇問題解析

    這篇文章主要介紹了python 中open文件路徑的選擇問題解析,本文給大家分享完美解決方法,需要的朋友可以參考下
    2021-07-07
  • 解決Python報錯No module named Crypto問題

    解決Python報錯No module named Crypto問題

    這篇文章主要介紹了解決Python報錯No module named“Crypto”問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • python?函數(shù)、變量中單下劃線和雙下劃線的區(qū)別詳解

    python?函數(shù)、變量中單下劃線和雙下劃線的區(qū)別詳解

    本文主要介紹了python?函數(shù)、變量中單下劃線和雙下劃線的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Pytorch中的廣播機(jī)制詳解(Broadcast)

    Pytorch中的廣播機(jī)制詳解(Broadcast)

    這篇文章主要介紹了Pytorch中的廣播機(jī)制詳解(Broadcast),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python+OpenGL制作一個元宵花燈

    Python+OpenGL制作一個元宵花燈

    又是一年元宵節(jié)!如果昨天情人節(jié)的紅包發(fā)得手軟又心疼,不妨利用Python OpenGL做一盞花燈送給女朋友,也許比紅包更能討她歡心呢
    2022-02-02
  • Python字符串格式化方式

    Python字符串格式化方式

    這篇文章主要介紹了Python字符串格式化方式,字符串格式化在我們的開發(fā)過程中被廣泛的應(yīng)用,因此也是我們要重點掌握的內(nèi)容之一,下文相關(guān)介紹,需要的朋友可以參考一下
    2022-04-04
  • Python爬蟲利用多線程爬取 LOL 高清壁紙

    Python爬蟲利用多線程爬取 LOL 高清壁紙

    這篇文章主要介紹了Python爬蟲利用多線程爬取 LOL 高清壁紙,通過網(wǎng)站爬取每一個英雄的所有皮膚圖片,全部下載下來并保存到本地,下文爬取過程感興趣的朋友可以參考一下
    2022-06-06
  • Python成功解決讀文件出現(xiàn):IOError:?[Errno?0]?Error的錯誤

    Python成功解決讀文件出現(xiàn):IOError:?[Errno?0]?Error的錯誤

    在Python編程中,處理文件是常見的任務(wù)之一,但偶爾也會遇到各種錯誤,包括IOError,盡管Python?3.x中IOError已被OSError和FileNotFoundError等更具體的異常所取代,由于[Errno?0]不直接指向具體的錯誤類型,我們將討論一系列可能導(dǎo)致IOError的常見情況,需要的朋友可以參考下
    2024-07-07
  • Python中列表乘法和列表推導(dǎo)式的區(qū)別舉例詳解

    Python中列表乘法和列表推導(dǎo)式的區(qū)別舉例詳解

    在Python中列表是一種非常靈活和強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),支持多種運算和操作,這篇文章主要介紹了Python中列表乘法和列表推導(dǎo)式區(qū)別的相關(guān)資料,文中通過代碼就介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04

最新評論

根河市| 鹿泉市| 湖南省| 陇南市| 麦盖提县| 佛冈县| 定边县| 延安市| 普安县| 大竹县| 双流县| 辉县市| 油尖旺区| 金昌市| 长丰县| 城固县| 仙游县| 华阴市| 正阳县| 卓尼县| 福清市| 什邡市| 张家港市| 剑川县| 龙江县| 广水市| 庆城县| 扎鲁特旗| 清水县| 怀柔区| 同江市| 霞浦县| 郴州市| 龙川县| 浪卡子县| 永吉县| 乌兰浩特市| 万盛区| 姚安县| 襄垣县| 德令哈市|