python基礎-面向物件(十六)面向物件進階(四)__slots__,__doc__,__module__,__class__,__del__,__call__
阿新 • • 發佈:2020-12-15
1.__slots__:一種寫在類內部的宣告(類變數),通過預先宣告例項屬性等物件並移除例項字典來節省記憶體。雖然這種技巧很流行,但想要用好卻並不容易,最好是隻保留在少數情況下采用,例如極耗記憶體的應用程式,並且其中包含大量例項。
簡單的說,就是節省記憶體的,因為例項物件後,物件都會有一個__dict__,如果一個類有很多例項,就很消耗記憶體,而使用__slots__後,例項就沒有了__dict__,只有__slots,定義了的屬性。__slots可以是列表,元祖,或者可迭代物件,,也可以是字串。
class Test: __slots__ = ['name','age'] test1=Test() test1.name = '蒼老師' test1.age = 20 print(test1.name,test1.age) print(test1.__dict__) #例項沒有__dict__
也無法設定屬性,因為設定屬性就是呼叫object.__dict[key],而例項沒有__dict__
2.__doc__類的描述資訊。無法被繼承,因為每個類都用自己的__doc__,沒設定就是None
class Test: '我是描述資訊' pass test1 = Test() print(test1.__doc__) print(Test.__doc__)
3.__module__:當前操作的物件在哪個模組
__class__:操作的物件的類是什麼
class Test: pass
from test import Test test1 = Test() print(test1.__module__) #test模組 print(test1.__class__) #test.Test類
4.__del__在例項將被銷燬時呼叫。 這還被稱為終結器或析構器(不適當)。 如果一個基類具有 __del__()
方法,則其所派生的類如果也有__del__()
方法,就必須顯式地呼叫它以確保例項基類部分的正確清除。
__del__方法可以 (但不推薦!) 通過建立一個該例項的新引用來推遲其銷燬。這被稱為物件重生
當直譯器退出時不會確保為仍然存在的物件呼叫__del__方法
註解
delx
並不直接呼叫x.__del__()
--- 前者會將x
的引用計數減一,而後者僅會在x
的引用計數變為零時被呼叫。
class Test: def __del__(self): print('開始清除') test1 = Test() test1.name = '蒼老師' del test1.name # 引用計數減一,沒有執行__del__ print(test1.__dict__) # 程式執行完了,會自動執行__del__ # del test1 #引用計數為0,會執行__del__
5.__call__:此方法會在例項作為一個函式被“呼叫”時被呼叫;如果定義了此方法,則x(arg1,arg2,...)
就大致可以被改寫為type(x).__call__(x,arg1,...)
。
什麼玩意?上面是python的官方解釋,完全看不懂說的啥。一句話就是例項加括號的時候呼叫。例項也能加括號?
class Test: def __call__(self, *args, **kwargs): print('開始call') test1 = Test() test1() #執行的Test下面的__call__ print(Test()) #執行的誰的__call__???返回例項