电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Python __slots__的使用方法

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

準備

正常情況下,創(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 :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中,但動態(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 = 10a.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 = 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__屬性是非常耗內存的,當創(chuàng)建上百萬個實例的時候,所有實例的__dict__會占用一塊很大的內存。沒有了__dict__的實例也就不能動態(tài)添加屬性,只需分配固定的空間來存儲已知的屬性。因此使用__slots__的類能節(jié)省一部分內存開銷。

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

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

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__內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 耐火浇注料价格-高强高铝-刚玉碳化硅耐磨浇注料厂家【直销】 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 过滤器_自清洗过滤器_气体过滤器_苏州华凯过滤技术有限公司 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 二手注塑机回收_旧注塑机回收_二手注塑机买卖 - 大鑫二手注塑机 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 合肥地磅_合肥数控切割机_安徽地磅厂家_合肥世佳电工设备有限公司 | 百方网-百方电气网,电工电气行业专业的B2B电子商务平台 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 液压油缸-液压站生产厂家-洛阳泰诺液压科技有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 艺术生文化课培训|艺术生文化课辅导冲刺-济南启迪学校 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 济南宣传册设计-画册设计_济南莫都品牌设计公司 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 南京欧陆电气股份有限公司-风力发电机官网 | 恒温水槽与水浴锅-上海熙浩实业有限公司 | 山东石英砂过滤器,除氟过滤器「价格低」-淄博胜达水处理 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 杭州公司变更法人-代理记账收费价格-公司注销代办_杭州福道财务管理咨询有限公司 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 空压机商城|空气压缩机|空压机配件-压缩机网旗下商城 | PCB接线端子_栅板式端子_线路板连接器_端子排生产厂家-置恒电气 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 |