__slots__
默認(rèn)情況下Python用一個(gè)字典來保存一個(gè)對象的實(shí)例屬性,字典浪費(fèi)了很多內(nèi)存。Python不能在對象創(chuàng)建時(shí)直接分配一個(gè)固定量的內(nèi)存來保存所有的屬性。因此如果你創(chuàng)建許多對象(我指的是成千上萬個(gè)),它會(huì)消耗掉很多內(nèi)存。
可以使用__slots__來告訴Python不要使用字典,而且只給一個(gè)固定集合的屬性分配空間。
Python允許在定義class的時(shí)候,定義一個(gè)特殊的__slots__變量,來限制該class能添加的屬性:
>>> class Student(object):
... __slots__ = ('name', 'age') # 用tuple定義允許綁定的屬性名稱
__slots__定義的屬性僅對當(dāng)前類起作用,對繼承的子類是不起作用的
除非在子類中也定義slots,這樣,子類允許定義的屬性就是自身的__slots__加上父類的__slots__。
http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue6/a-guide-to-pythons-magic-methods.html
__new__([cls, ...) 是一個(gè)對象實(shí)例化時(shí)第一個(gè)調(diào)用的方法,他的第一個(gè)參數(shù)是這個(gè)類,其他參數(shù)用來傳遞給__init__方法
__init__(self, […)此方法為類的初始化方法。當(dāng)構(gòu)造函數(shù)被調(diào)用的時(shí)候的任何參數(shù)都將會(huì)傳給它。(比如如果我們調(diào)用 x = SomeClass(10, 'foo')),那么 init 將會(huì)得到兩個(gè)參數(shù)10和foo。
__del__(self) 如果 __new__ 和__init__ 是對象的構(gòu)造器的話,那么__del__ 就是析構(gòu)器。它不實(shí)現(xiàn)語句 del x (以上代碼將不會(huì)翻譯為x.__del__())。它定義的是當(dāng)一個(gè)對象進(jìn)行垃圾回收時(shí)候的行為。當(dāng)一個(gè)對象在刪除的時(shí)需要更多的清潔工作的時(shí)候此方法會(huì)很有用,比如套接字對象或者是文件對象。
__dict__
對象的屬性儲(chǔ)存在對象的__dict__屬性中。__dict__為一個(gè)詞典,鍵為屬性名,對應(yīng)的值為屬性本身。
#會(huì)話管理器
#enter:定義當(dāng)使用with語句定義一個(gè)代碼塊時(shí)會(huì)話管理器應(yīng)該做什么。
#exit:定義當(dāng)一個(gè)代碼塊被執(zhí)行或者終止后會(huì)話管理器應(yīng)該做什么。
class FileObject(object):
def __init__(self, filepath='sample.txt'):
self.file = open(filepath, 'r+')
def __enter__(self): # 與with語句對應(yīng)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
self.file.close()
del self.file
with FileObject() as fp:
print fp.read()
__getattr__:查詢不在dict系統(tǒng)中的對象屬性或者對象方法。
>>> print(s) # 調(diào)用__str__方法
Student object (name: Michael)
>>> s() # 調(diào)用__call__方法
Student object (name: Michael)
class Entity:
'''調(diào)用實(shí)體來改變實(shí)體的位置。'''
def __init__(self, size, x, y):
self.x, self.y = x, y
self.size = size
def __call__(self, x, y):
'''改變實(shí)體的位置'''
self.x, self.y = x, y
def __getitem__(self, item):
return '返回值(__getitem__, 使用索引訪問某個(gè)元素)'
def __getattr__(self, item):
return '此實(shí)例沒有這個(gè)屬性{0}'.format(item)
a = Entity('大小',2,3)
print a.x # 2
print a.size # 大小
a.x = 8
print a.x # 8
print a[4] # 返回值(__getitem__, 使用索引訪問某個(gè)元素
print a.sdfa #此實(shí)例沒有這個(gè)屬性sdfa