python中雙下劃線屬性和方法詳解

2021-09-19 16:00:28 字數 3562 閱讀 6241

__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形式單獨匯入。類屬性和類方法使用單下劃線 開頭 開頭為保護型別的屬性和方法,僅允...