摘要:限制上一篇有提到通過(guò)動(dòng)態(tài)綁定在類外部定義方法,然后動(dòng)態(tài)地給類加上新的功能,使得類的實(shí)例都能調(diào)用外部方法。這樣子類實(shí)例允許定義的屬性就是自身的父類的限定的屬性。但是屬性沒(méi)有在限制中,故不能動(dòng)態(tài)綁定,會(huì)報(bào)錯(cuò)。
限制__slot__
上一篇有提到通過(guò)動(dòng)態(tài)綁定:在類外部定義方法,然后動(dòng)態(tài)地給類加上新的功能,使得類的實(shí)例都能調(diào)用外部方法。
但如果要限制實(shí)例的屬性,不允許動(dòng)態(tài)地添加,該怎么辦呢?
為了達(dá)到限制的目的,python允許在定義class的時(shí)候,定義一個(gè)特殊的 slots 變量,來(lái)限制該class實(shí)例動(dòng)態(tài)添加屬性。
那使用__slot__的好處呢?
防止用戶隨意動(dòng)態(tài)增加實(shí)例屬性;
節(jié)約內(nèi)存,因?yàn)閯?dòng)態(tài)綁定時(shí)屬性存儲(chǔ)在__dict__中;
更快的屬性訪問(wèn)速度。
例如:只允許對(duì)Student實(shí)例添加 name 和 age 屬性。
>>> class Student(object): ... __slots__ = ("name","age") # 使用tuple定義允許綁定的屬性名稱 >>> s = Student() # 創(chuàng)建新的實(shí)例 >>> s.name = "xlp" # 綁定屬性name >>> s.age = 24 # 綁定屬性age >>> s.score = 99 # 綁定屬性score # 但是score沒(méi)有放到__slots__中,所以不能綁定score屬性,報(bào)錯(cuò)。 Traceback (most recent call last): File "", line 1, in AttributeError: "Student" object has no attribute "score"
?。?!但是__slots__定義的屬性只對(duì)當(dāng)前類的實(shí)例起作用,對(duì)繼承的子類是不起作用的。除非在子類中也定義__slots__。
這樣子類實(shí)例允許定義的屬性就是自身的__slots__ + 父類的__slots__ 限定的屬性。
例如:
>>> class SStudent(Student): ... __slots__ = "gender" ... >>> g = SStudent() >>> g.name = "xxx" >>> g.score = 99 # 子類依舊可以動(dòng)態(tài)綁定屬性 >>> g.gender = "Female" >>> g.teacher = "Mrs. Wang" # 不允許綁定咯~ Traceback (most recent call last): File "", line 1, inAttributeError: "SStudent" object has no attribute "teacher"
子類SStudent除掉可以綁定name、age,還可以綁定定義在子類__slot__中的gender屬性。
但是teacher屬性沒(méi)有在__slot__限制中,故不能動(dòng)態(tài)綁定,會(huì)報(bào)錯(cuò)。
? thanks for watching, keep on updating...
點(diǎn)個(gè)贊再走吧
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/44978.html
摘要:概述如果程序處理的數(shù)據(jù)比較多比較復(fù)雜,那么在程序運(yùn)行的時(shí)候,會(huì)占用大量的內(nèi)存,當(dāng)內(nèi)存占用到達(dá)一定的數(shù)值,程序就有可能被操作系統(tǒng)終止,特別是在限制程序所使用的內(nèi)存大小的場(chǎng)景,更容易發(fā)生問(wèn)題。下面我就給出幾個(gè)優(yōu)化占用內(nèi)存的幾個(gè)方法。 概述 如果程序處理的數(shù)據(jù)比較多、比較復(fù)雜,那么在程序運(yùn)行的時(shí)候,會(huì)占用大量的內(nèi)存,當(dāng)內(nèi)存占用到達(dá)一定的數(shù)值,程序就有可能被操作系統(tǒng)終止,特別是在限制程序所使用...
摘要:聲明對(duì)象構(gòu)造函數(shù),創(chuàng)建實(shí)例需要用到訪問(wèn)限制封裝性是面向?qū)ο蟮囊淮筇攸c(diǎn),如果要內(nèi)部屬性不被外部調(diào)用,需要加上兩個(gè)下劃線這樣就沒(méi)辦法直接通過(guò)實(shí)例來(lái)訪問(wèn)這個(gè)變量了因?yàn)檫@個(gè)時(shí)候,變量已經(jīng)被隱式的變成了繼承繼承的一般寫法為所有的類都繼承于這個(gè)類。 包 python中包的引用是一個(gè)坑,經(jīng)常出現(xiàn)這個(gè)文件夾的代碼,引用不到另一個(gè)文件夾的代碼,這個(gè)時(shí)候就必須要去更改環(huán)境變量,無(wú)論如何,總感覺(jué)不是一種優(yōu)雅...
摘要:構(gòu)造函數(shù)構(gòu)造函數(shù)參數(shù)列表在使用類創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用。類是從一堆對(duì)象中抽取相同的屬性及方法得出的,抽象類就是從一堆類中抽取相同的屬性及方法得出的。抽象類不能實(shí)例化對(duì)象。 1.構(gòu)造函數(shù) 構(gòu)造函數(shù):__init__(參數(shù)列表) :在使用類創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用。注意:如果自己不寫構(gòu)造函數(shù),系統(tǒng)默認(rèn)也會(huì)加上一個(gè)空的構(gòu)造函數(shù)。對(duì)象屬性的優(yōu)先級(jí)高于類屬性,當(dāng)對(duì)象調(diào)用屬性時(shí),如果有對(duì)象屬性時(shí),先獲取對(duì)...
摘要:以便于用戶理解的方式返回對(duì)象的字符串表示形式。函數(shù)會(huì)調(diào)用函數(shù),對(duì)來(lái)說(shuō),輸出的是一個(gè)有序?qū)Α4送?,還有用于支持內(nèi)置的構(gòu)造函數(shù)的方法。可散列實(shí)現(xiàn)了方法,使用推薦的異或運(yùn)算符計(jì)算實(shí)例屬性的散列值私有屬性最好用命名規(guī)則來(lái)實(shí)現(xiàn)這種方式有好有壞 絕對(duì)不要使用兩個(gè)前導(dǎo)下劃線,這是很煩人的自私行為。——Ian Bicking 對(duì)象表示形式 repr() 以便于開(kāi)發(fā)者理解的方式返回對(duì)象的字符串表示形式...
摘要:本篇繼續(xù)學(xué)習(xí)之路,實(shí)現(xiàn)更多的特殊方法以讓自定義類的行為跟真正的對(duì)象一樣。之所以要讓向量不可變,是因?yàn)槲覀冊(cè)谟?jì)算向量的哈希值時(shí)需要用到和的哈希值,如果這兩個(gè)值可變,那向量的哈希值就能隨時(shí)變化,這將不是一個(gè)可散列的對(duì)象。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第二篇。前一篇講的是內(nèi)置對(duì)象的結(jié)構(gòu)和行為,本篇?jiǎng)t是自定義對(duì)象。本篇繼續(xù)Python學(xué)習(xí)之路20,實(shí)現(xiàn)更多的特殊方法以讓...
閱讀 1449·2021-09-24 10:26
閱讀 1744·2019-08-30 14:14
閱讀 2191·2019-08-29 16:54
閱讀 419·2019-08-29 14:09
閱讀 1538·2019-08-29 12:55
閱讀 994·2019-08-28 18:13
閱讀 1635·2019-08-26 13:39
閱讀 2632·2019-08-26 11:43