日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python __slots__的使用方法

瀏覽:126日期:2022-07-05 14:13:42

準備

正常情況下,創建class的實例后,可以給該實例綁定任何屬性和方法,這就是動態語言的靈活性。首先定義一個class

class A(object): pass

然后創建一個實例,并給實例添加屬性和方法。

a = A()print a.__dict__ #{}A.name = ’xiaoming’ #動態的給實例綁定屬性,其實例屬性會保存到實例的__dict__中print a.__dict__ #{’name’: ’xiaoming’}f = lambda :100a.fun = f print a.__dict__ #{’fun’: <function <lambda> at>, ’name’: ’xiaoming’}

此時的name屬性和fun()方法只有實例a能使用,類A的其他實例不能使用,如果想讓類A的所有實例都能使用,我們需要給類A綁定方法

print A.__dict__ #...f = lambda :100A.fun = f print A.__dict__ #... + ’fun’: <function <lambda> at 0x0000000003582978>

此時,類A的所有實例就能使用方法fun()了。

​ 通常情況下,上面的fun()方法應該定義在class中,但動態綁定允許在程序運行的過程中動態的給class增加功能,這在靜態語言中很難實現,這也是動態語言的優點。

__slots__

​ 如果在一個類中定義了__slots__屬性,那么這個類的實例將不會擁有__dict__屬性,沒有__dict__的實例也就不能添加實例屬性了。簡單來說,__slots__的作用就是阻止類在實例化時為實例分配__dict__屬性,限制該實例能添加的屬性。

作用

​ 通常情況下實例使用__dict__來存儲自己的屬性,它允許實例動態地添加或刪除屬性。然而,對一些在編譯期就已經知道有什么變量的類或者不允許動態添加變量的類來說,它們并不需要動態地添加變量。如果想要限制實例屬性,不想讓它動態添加屬性怎么辦?比如我們只允許對A的實例添加name和age屬性。

​ 為了達到上述目的,Python允許在定義class的時候,定義一個__slots__變量,來限制該class的實例能添加的屬性。

class A(object): __slots__ = (’age’,’name’)a = A()a.name = ’xiaoming’a.age = 10a.id = 123456 #error AttributeError: ’A’ object has no attribute ’id’

由于id不在__slots__中,所以實例不能添加id屬性。任何試圖給實例添加一個其名不在__slots__中的屬性都將觸發AttributeError異常。

實現原理

__slots__中的變量是類屬性,類型為數據描述符。

#!/usr/bin/python# -*- coding: utf-8 -*-class Foo(object): __slots__ = (’age’,’name’) def __init__(self,age = 0): self.age = ages = Foo.__dict__[’age’]print s #<member ’age’ of ’Foo’ objects>print type(s) #<type ’member_descriptor’>’’’證明為數據描述符’’’print ’__get__’ in dir(s) #Trueprint ’__set__’ in dir(s) #True

__slots__中的變量雖然是類屬性,但是不同實例之間互不影響。因為描述符方法的一個參數為實例,建立一個實例和值的映射還是很簡單的。如果不懂,建議看描述符 。

f1 = Foo(1)f2 = Foo(2)print f1.age,f2.age #1,2print Foo.__dict__[’age’].__get__(f1) #1print Foo.__dict__[’age’].__get__(f2) #2

__slots__的好處

如果類沒有定義__slots__ ,該類的實例會有__dict__屬性,通過__dict__可修改,刪除,增加實例屬性。

如果類定義了__slots__,該類的實例不會有__dict__屬性。實例中的__dict__屬性是非常耗內存的,當創建上百萬個實例的時候,所有實例的__dict__會占用一塊很大的內存。沒有了__dict__的實例也就不能動態添加屬性,只需分配固定的空間來存儲已知的屬性。因此使用__slots__的類能節省一部分內存開銷。

對于不需要動態添加屬性的類來說,應使用__slots__。

注意:不用過早的使用這個方法,它不利于代碼維護,當實例很多(上千萬)時,這種優化才有明顯的效果。在實際使用中,__slots__從未被當作一種安全的特性來使用,它是對內存和執行速度的一種性能優化。使用__slots__的類的實例不再使用字典來存儲實例屬性,而是使用基于數組的一種更加緊湊的數據結構,所以當實例很多時,使用__slots__可以顯著減少內存占用和執行時間。

class A(object): passclass B(object): __slots__ = (’age’,’name’)a = A()b = B()

沒有__slots__的類和實例

print a.__dict__ #{}print A.__dict__ ’’’{’__dict__’: <attribute ’__dict__’ of ’A’ objects>, ’__module__’: ’__main__’, ’__weakref__’: <attribute ’__weakref__’ of ’A’ objects>, ’__doc__’: None}’’’

有__slots__的類和實例

print b.__dict__ #AttributeError: ’B’ object has no attribute ’__dict__’print B.__dict__’’’{’age’: <member ’age’ of ’B’ objects>, ’__module__’: ’__main__’, ’__doc__’: None, ’__slots__’: (’age’, ’name’), ’name’: <member ’name’ of ’B’ objects>}’’’

使用定義__slots__的類的注意事項

class Foo(object): __slots__ = (’age’,’name’)

1.__slots__僅對當前類起作用,對子類是不起作用的,除非在子類中也定義__slots__,這樣,子類允許定義的屬性就是自身的__slots__加上父類的__slots__。

class F1(Foo): passclass F2(Foo): __slots__ = ()f1,f2 = F1(),F2()f1.a = 1f2.a = 1 #AttributeError: ’F2’ object has no attribute ’a’f2.age = 1

2.如果實例未給__slots__中的變量賦值,該實例不能使用__slots__中的變量。

f = Foo()print f.age #AttributeError: agef.age = 1print f.age #1

3.實例將不再擁有__dict__,但是類還是擁有__dict__屬性的,所以還是可以給類增加類屬性的;

f = Foo()Foo.xx = 1print f.xx #1

4.定義了__slots__后,如果__slots__中的變量為類變量,該變量對于該類的實例來說是只讀的。如果想修改的話,可以通過類來修改。

class Foo(object): __slots__ = (’age’,’name’) age = 10 def __init__(self): self.name = ’xiaoming’f = Foo()print f.name #’xiaoming’print f.age #10f.name = ’xiaohong’ #f.age = 12 #AttributeError: ’Foo’ object attribute ’age’ is read-onlyFoo.age = 12 #正確print f.name #’xiaohong’print f.age #12#del f.age #AttributeError: ’Foo’ object attribute ’age’ is read-only#del f.name 調用的是描述符方法__delete__,應該是將描述符中存儲的實例與值的映射刪除了del f.name #實例屬性的刪除還是可以的,但是刪除的并不是類字典中的name屬性print f.name #AttributeError: namedel Foo.age #通過類來刪除類屬性還是可以的,不過這樣會影響該類的所有實例print f.age #AttributeError: ’Foo’ object has no attribute ’age’

原因不知道…有知道的大神求指導…

參考網址1.http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200605560b1bd3c660bf494282ede59fee17e7810002.http://www.jianshu.com/p/ef1797577f713.http://www.jianshu.com/p/82ce2151d73b4.http://blog.csdn.net/lis_12/article/details/53453665

到此這篇關于Python __slots__的使用方法的文章就介紹到這了,更多相關Python __slots__內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久香蕉精品香蕉| 中文字幕在线视频久| 亚洲成人免费| 欧美激情日韩| 亚洲尤物av| 蜜桃视频在线网站| 国产日产高清欧美一区二区三区 | 成人精品天堂一区二区三区| 婷婷综合网站| 久久久国产精品网站| 欧美视频一区| 好看的亚洲午夜视频在线| 亚洲精品免费观看| 91精品推荐| 免费日韩av| 青青久久av| 国产一区二区高清| 偷拍亚洲精品| 国产麻豆精品| 宅男在线一区| 日av在线不卡| 亚洲作爱视频| 欧美一级二级三级视频| 免费观看不卡av| 国产一区日韩欧美| 国产一区二区精品| 福利在线免费视频| 日韩午夜av| 欧美亚洲国产精品久久| 精精国产xxxx视频在线野外| av资源中文在线| 欧美午夜精品一区二区三区电影| 国产精品女主播一区二区三区| 99在线精品免费视频九九视| 欧美综合国产| 在线国产日韩| 国产高清亚洲| 桃色av一区二区| 日韩中文字幕麻豆| 日本成人在线视频网站| 国产日韩一区| 欧洲精品一区二区三区| 亚洲一级在线| 日韩高清一区在线| 国产精品一区二区免费福利视频 | 国产91在线精品| 婷婷成人综合| 日韩一区精品| 成人av三级| 99视频一区| 黄色网一区二区| 日韩专区欧美专区| 成人黄色av| 丝袜av一区| 精品不卡一区| 国产美女精品视频免费播放软件| 国产日韩精品视频一区二区三区| 精品三级国产| 7777精品| 久久久国产精品一区二区中文| 久久精品国产久精国产| 国产精品婷婷| 亚洲婷婷丁香| 亚洲少妇诱惑| 亚洲精品永久免费视频| 国产精品v一区二区三区| 亚洲少妇自拍| 久久久久观看| 国产精品久久久久久久久久久久久久久 | 国产亚洲激情| 国产亚洲高清一区| 日韩国产成人精品| 亚久久调教视频| 色偷偷偷在线视频播放| 日本不卡视频在线观看| 国产一区白浆| 日韩精品免费视频人成 | 日韩在线视频精品| 伊人久久一区| 99精品在线观看| 色婷婷亚洲mv天堂mv在影片| 国产精品黄色| 国产日韩三级| 国产欧美自拍| 国产精品17p| 日本欧美大码aⅴ在线播放| 一区二区三区网站| 日韩精品欧美| 日韩深夜视频| 欧美一区二区三区久久| 奇米亚洲欧美| 日本一区免费网站| 亚洲欧美久久| 午夜精品一区二区三区国产| 国产91一区| 美女福利一区二区三区| 亚洲国产福利| 精品国产美女a久久9999| 久久福利在线| 国产一区二区三区黄网站| 韩国久久久久久| 综合一区av| 日本免费一区二区三区四区| 免费成人av在线播放| 久久国际精品| 欧美一级专区| 精品三级在线观看视频| 在线一区免费观看| 国产日韩一区二区三区在线播放| av资源亚洲| 国产欧美一区二区三区国产幕精品 | 国产精品久久久久久久久妇女| 国产精品老牛| 日本电影久久久| 久久久久蜜桃| 日韩高清不卡一区二区| 国产 日韩 欧美一区| 日韩和欧美一区二区三区| 久久久久97| 99视频精品免费观看| 久久91视频| 色综合视频一区二区三区日韩| 午夜电影亚洲| 国产精品日本一区二区不卡视频 | 久久99精品久久久久久园产越南| 国产一区二区三区四区大秀| 日韩av有码| 视频精品一区二区| 日韩天堂在线| 国产精品欧美大片| 日本不卡一区二区| 国产精品一区二区三区www| 久久精品毛片| 日韩高清在线观看一区二区| 欧美/亚洲一区| www.com.cn成人| 国产精品分类| 欧美精品影院| 日韩中文字幕一区二区高清99| 国内精品福利| 国产成人免费精品| 国产激情综合| 91中文字幕精品永久在线| 国产在线|日韩| 男人的天堂亚洲一区| 国产日韩视频| www成人在线视频| 日本欧美韩国一区三区| 岛国av在线播放| 蜜桃av一区二区| 在线亚洲人成| 日韩欧美高清一区二区三区| 国产精品免费不| 伊人久久大香线蕉av不卡| 不卡福利视频| 亚洲丝袜美腿一区| 国产一区2区| 国产精品玖玖玖在线资源| 91成人在线精品视频| 蜜桃视频一区二区三区| 久久不射网站| 久久精品卡一| 日韩在线欧美| 国产女人18毛片水真多18精品| 69堂精品视频在线播放| 欧美日本不卡| 国产亚洲一区二区三区啪| av资源亚洲| 久久精品官网| 亚洲少妇诱惑| 欧美精品中文字幕亚洲专区| 国产精品视频一区二区三区四蜜臂 | 亚洲网站视频| 久久狠狠婷婷| 欧美精品一区二区久久| 亚州精品视频| 91视频久久| 免播放器亚洲| 国产亚洲一区| 欧美日韩一二| 日韩av不卡在线观看| 精品国产一区二区三区av片| 99久久久久国产精品| 一区二区电影| 久久精品凹凸全集| 色吊丝一区二区| 日韩成人午夜精品| 欧美特黄a级高清免费大片a级| 天堂久久一区| 神马午夜在线视频| 亚洲精品免费观看| 欧美日韩视频网站| 国产欧美亚洲一区| av成人国产| 国产超碰精品| 久久国产人妖系列| 国产一区白浆| 欧美国产91| 国产精品一级| 亚洲自拍另类|