1. 程式人生 > 實用技巧 >python基礎-面向物件(十六)面向物件進階(四)__slots__,__doc__,__module__,__class__,__del__,__call__

python基礎-面向物件(十六)面向物件進階(四)__slots__,__doc__,__module__,__class__,__del__,__call__

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__是否會在重生的物件將被銷燬時再次被呼叫是由具體實現決定的 ;當前的CPython實現只會呼叫一次。

當直譯器退出時不會確保為仍然存在的物件呼叫__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__???返回例項