国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-15 22:54:15
字體:
供稿:網(wǎng)友

簡介

在廖雪峰的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'}            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 文水县| 潞西市| 灌南县| 额济纳旗| 安顺市| 雷州市| 磐安县| 瓮安县| 淮南市| 汶上县| 博乐市| 义乌市| 锡林郭勒盟| 石泉县| 司法| 衡阳市| 汶上县| 沛县| 调兵山市| 弋阳县| 平陆县| 奇台县| 调兵山市| 望谟县| 三河市| 天柱县| 济宁市| 石景山区| 区。| 武平县| 荥阳市| 凤翔县| 宜川县| 酒泉市| 凌云县| 龙海市| 伊金霍洛旗| 萍乡市| 黔东| 灌南县| 惠安县|