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

Python __slots__的使用方法

 更新時間:2020年11月15日 10:22:19   作者:憂桑的小兔子  
這篇文章主要介紹了Python __slots__的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

準備

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

class A(object):
  pass

然后創(chuàng)建一個實例,并給實例添加屬性和方法。

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

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

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

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

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

__slots__

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

作用

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

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

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

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

實現原理

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
class Foo(object):
  __slots__ = ('age','name')
  def __init__(self,age = 0):
    self.age = age

s = Foo.__dict__['age']
print s          #<member 'age' of 'Foo' objects>
print type(s)       #<type 'member_descriptor'>
'''證明為數據描述符'''
print '__get__' in dir(s) #True
print '__set__' in dir(s) #True

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

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

__slots__的好處

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

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

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

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

class A(object):
  pass

class 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):
  pass

class F2(Foo):
  __slots__ = ()

f1,f2 = F1(),F2()
f1.a = 1
f2.a = 1    #AttributeError: 'F2' object has no attribute 'a'
f2.age = 1

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

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

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

f = Foo()
Foo.xx = 1
print 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     #10
f.name = 'xiaohong' 

#f.age = 12     #AttributeError: 'Foo' object attribute 'age' is read-only

Foo.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: name

del Foo.age     #通過類來刪除類屬性還是可以的,不過這樣會影響該類的所有實例
print f.age     #AttributeError: 'Foo' object has no attribute 'age' 

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

參考網址
1.http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200605560b1bd3c660bf494282ede59fee17e781000
2.http://www.jianshu.com/p/ef1797577f71
3.http://www.jianshu.com/p/82ce2151d73b
4.http://blog.csdn.net/lis_12/article/details/53453665

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

相關文章

  • Python如何截圖保存的三種方法(小結)

    Python如何截圖保存的三種方法(小結)

    這篇文章主要介紹了Python如何截圖保存的三種方法(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • python中array數組添加一行或一列數據的具體實現

    python中array數組添加一行或一列數據的具體實現

    這篇文章主要給大家介紹了關于python中array數組添加一行或一列數據的具體實現,最近經常使用到數組方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • Python編程實現數學運算求一元二次方程的實根算法示例

    Python編程實現數學運算求一元二次方程的實根算法示例

    這篇文章主要介紹了Python編程實現數學運算求一元二次方程的實根算法,涉及Python數學運算求解方程的相關實現技巧,需要的朋友可以參考下
    2017-04-04
  • python中for循環(huán)把字符串或者字典添加到列表的方法

    python中for循環(huán)把字符串或者字典添加到列表的方法

    今天小編就為大家分享一篇python中for循環(huán)把字符串或者字典添加到列表的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • pytorch中的model=model.to(device)使用說明

    pytorch中的model=model.to(device)使用說明

    這篇文章主要介紹了pytorch中的model=model.to(device)使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python爬蟲eval實現看漫畫漫畫柜mhgui實戰(zhàn)分析

    Python爬蟲eval實現看漫畫漫畫柜mhgui實戰(zhàn)分析

    這篇文章主要為大家介紹了Python爬蟲eval實現看漫畫漫畫柜mhgui實戰(zhàn)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 在雙python下設置python3為默認的方法

    在雙python下設置python3為默認的方法

    這篇文章主要介紹了如何在雙python下設置python3為默認,本文通過一個例子分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • Python對excel文檔的操作方法詳解

    Python對excel文檔的操作方法詳解

    這篇文章主要介紹了Python對excel文檔的操作方法,結合實例形式分析了Python基于xlrd、xlwd庫針對Excel文件的讀寫、sheet表創(chuàng)建、獲取、遍歷等相關操作技巧,需要的朋友可以參考下
    2018-12-12
  • Python QQBot庫的QQ聊天機器人

    Python QQBot庫的QQ聊天機器人

    這篇文章主要為大家詳細介紹了基于Python QQBot庫的QQ聊天機器人,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • python 利用jieba.analyse進行 關鍵詞提取

    python 利用jieba.analyse進行 關鍵詞提取

    這篇文章主要介紹了python 利用jieba.analyse進行關鍵詞提取的方法,幫助大家更好的利用python,感興趣的朋友可以了解下
    2020-12-12

最新評論