__dict__
__slots__
參考
用於更快地得到屬性
更加節約記憶體
例1
_ slots
和 _dict _的接收屬性的不同。
class lqq():
__slots__ = ('a',) # 元素為屬性名;當設定了這個屬性而且lqq沒有繼承沒有__slot__屬性的類(如object),則lqq沒有預設的__dict__
class lqq1():#預設有__dict__
pass
lq = lqq()
lq1 = lqq1()
lq.a = 1
lq1.b = 2 # 有__dict__屬性,b:2,會以鍵值對的形式加入dict裡
lq.b = 2 # 報錯,因為slot裡沒有b,而且lq沒有__dict__.可以自己print(lq.__dict__)會報錯
例2
slots和dict並存
class lqq():
__slots__ = ('a','__dict__') # 方法一:在slots裡設定dict引數
class lqq2:#預設有dict
pass
class lqq1(lqq2):方法二:繼承dict
__slots__ = ('a',)
lq = lqq()
lq1 = lqq1()
lq.b = 2 #不報錯
lq1.b =2#不報錯
例3
slots的繼承
class lqq():
__slots__ = ('a',) # 元素為屬性名;當設定了這個屬性而且lqq沒有繼承沒有__slot__屬性的類(如object),則lqq沒有預設的__dict__
class lqq1(lqq):
__slots__ = ('b',)
lq1 = lqq1()
lq1.a =2 # 不報錯,繼承了lqq的slots中的a
slots不能繼承多個有非空slots的父類
class basea(object):
__slots__ = ('a',)
class baseb(object):
__slots__ = ('b',)
class child(basea, baseb): __slots__ = ()
例4
更快
import timeit
class foo(object): __slots__ = 'foo',
class bar(object): pass
slotted = foo()
not_slotted = bar()
def get_set_delete_fn(obj):
def get_set_delete():
obj.foo = 'foo'
obj.foo
del obj.foo
return get_set_delete
print(min(timeit.repeat(get_set_delete_fn(slotted))))
print(min(timeit.repeat(get_set_delete_fn(not_slotted))))
例5
更少記憶體,並存時,有限slots
dict儲存會以鍵值對的形式儲存
class lqq():
__slots__ = ('a',)
lq = lqq()
lq.a = 1 #
class lqq1():
pass
lq1 = lqq1()
lq1.a = 1 #
from sys import getsizeof
print(getsizeof(lq)) #48
print(getsizeof(lq1)) #56
class lqq():
__slots__ = ('a','__dict__') # 元素為屬性名;當設定了這個屬性而且lqq沒有繼承沒有__slot__屬性的類(如object),則lqq沒有預設的__dict__
lq = lqq()
lq.b = 2 #
lq.a = 1 #
print(lq.__dict__)#沒有a
print(lq.__slots__)
1,__bool__
python定義的每乙個物件都是可以判斷真假的,而在需要判斷的時候,會呼叫物件的__bool__
方法(預設只能返回true或false)
class lqq():
def __bool__(self):###類物件是真假
return false
print(bool(lqqq1)) # false
2,***__repr__
***
當你print乙個物件的時候,列印出的資訊其實就是repr(我統一不加下劃線了)方法的返回的str。在namedtuple中簡化了以下:
class lqq(tuple):
def __new__(_cls, x, y, ):
'create new instance of ()'
return tuple.__new__(_cls, (x, y,))
def __repr__(self):
'return a nicely formatted representation string'
print('repr')
return self.__class__.__name__ + '(x='+str(1)+','+'y='+str(2)+')'
print(lqq(1, 2))
# 當沒有重寫repr的時候預設使用父類tuple的repr,結果(1, 2)
#使用後列印結果lqq(x=1,y=2)
介紹如在collections abstract base classes中的那些抽象函式。
__getitem__
序列(sequnce)和對映(maping)的抽象函式
方法返回值 對應 obj[aruge]
class lqq():
def __getitem__(self, item):
return 2
lqqq1 = lqq()
print(lqqq1[1])# __getitem__
__contains__
Python中單下劃線和雙下劃線
python中存在一些特殊的方法,有些方法以雙下劃線 開頭和結尾,它們是python的魔法函式,比如 init 和 str 等等。不用要這種方式命名自己的變數或者函式。class a def init self,text self.text text def str self return self...
Python中單下劃線和雙下劃線
雙下劃線開頭和結尾 python中存在一些特殊的方法,有些方法以雙下劃線 開頭和結尾,它們是python的魔法函式,比如 init 和 str 等等。不用要這種方式命名自己的變數或者函式。classa def init self,text self.text text def str self re...
python中單下劃線 和雙下劃線(
函式使用單下劃線 開頭 使用單下劃線 開頭的函式 func不能被模組外部以 from module www.cppcns.comimport 形式匯入。但程式設計客棧可以用 from module import func形式單獨匯入。類屬性和類方法使用單下劃線 開頭 開頭為保護型別的屬性和方法,僅允...