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