1. 程式人生 > >python-24-如何派生類內建不可變型別並修改其例項化行為?如何為建立大量例項節省記憶體?

python-24-如何派生類內建不可變型別並修改其例項化行為?如何為建立大量例項節省記憶體?

image

image

# 建立一個插口IntTuple,包含內建插口tuple,行為一致.tuple是一個不可變物件,所以我們不能從self來刪除一些資料
class IntTuple(tuple):
    #__new__的引數是一個類物件,此時我們來修改他
    def __new__(cls,iterable):
        # 使用生成器物件
        g = (x for x in iterable if isinstance(x,int) and x > 0)
        return super(IntTuple,cls).__new__(cls,g)


    def __init__(self,iterable):
        # py2需要在__init__裡面傳參
        print(self) #此時已經建立好了
        super(IntTuple,self).__init__()


t = IntTuple([1,-1,'abc',6,['x','y'],3])

print(t)
from  e import Player,Player2
p1 = Player(‘0001’,’Jim’)
p2 = Player2(‘0001’,’Jim’)
如果p1比p2使用的記憶體多的話,那麼一定是多了某些屬性
dir(p1)

image

dir(p2)

image

這樣看有些麻煩,我們可以這樣:

set(dir(p1)) – set(dir(p2))

image

__dict__是一個字典,例項動態繫結屬性的字典,屬性就是字典裡的一項

image

image

當然,既然有動態新增,我們也可以動態解除

image

動態繫結屬性的特性,是以犧牲記憶體為代價的

我們可以import sys模組來監測

image

使用__slots__來解除動態繫結,也就沒有了__dict__屬性了

image