python 的物件天生擁有一些神奇的方法,它們總被雙下劃線所包圍,他們是物件導向的 python 的一切。
他們是可以給你的類增加魔力的特殊方法,如果你的物件過載了這些方法中的某乙個,那麼這個方法就會在特殊的情況下被 python 所呼叫,你可以定義自己想要的行為,而這一切都是自動發生的。
new(cls[, …])
在第一次遇見__init__(self[,…])方法時我們會認為物件建立時第乙個呼叫的方法就是它,其實不是。第一次呼叫的方法是__new__(cls[,…])。__init__更多的是負責初始化操作,相當於乙個專案中的配置檔案,new__才是真正的建構函式,建立並返回乙個例項物件,如果__new__只呼叫了一次,就會得到乙個物件。它的第乙個引數是這個類,其他的引數是用來直接傳遞給__init方法
class
testclass
: def __init__
(self)
:print
("呼叫__init__"
) def __new__
(cls,
*args,
**kwargs)
:print
("呼叫__new__"
)return object.
__new__
(cls)#返回當前類的例項
t =testclass
()
結果
呼叫__init___new_ 決定是否要使用該__init__ 方法,因為__new__ 可以呼叫其他類的構造方法或者直接返回別的例項物件來作為本類的例項,如果new沒有返回例項物件,則__init__ 不會被呼叫。呼叫__new__
classa:
pass
class
b(a)
: def __init__
(self)
:print
("呼叫__init__"
) def __new__
(cls,
*args,
**kwargs)
:print
("呼叫__new__"
)return object.
__new__
(a)#返回父類的例項,不會呼叫__init__方法
t =b
()
結果:
呼叫__new__del(self)
有了建構函式自然少不了析構函式。python中__del__可以認為是析構函式了,在乙個例項被銷毀時它會執行。該方法是直譯器自動呼叫的,一般情況下不重寫。
class
testclass
: def __new__
(cls,
*args,
**kwargs)
:print
("建立例項"
)return object.
__new__
(cls)
def __init__
(self)
:print
("初始化例項"
) def __del__
(self)
:print
("銷毀"
)print
("自動呼叫del"
)t =
testclass
()
結果
建立例項_str_(self)當被 str() 呼叫時會執行__str__初始化例項
銷毀自動呼叫del
_getattr_(self[,…])
當我們訪問乙個不存在的屬性時會呼叫此方法,如果屬性存在則不會呼叫。
class
testclass
: def __getattr__
(self, item)
:print
("不存在的屬性"
)return item
def __init__
(self,name)
: self.name = name
t =testclass
("tom"
)print
(t.name)
print
(t.age)#age屬性不存在
結果
tom如果我們不重寫__getattr__方法,當我們訪問乙個不存在的屬性時會丟擲atrributeerror的錯誤。不存在的屬性
age
_getattribute_(self, item)
給方法和__getattr__方法類似,但是它更加強大,所有訪問屬性的行為都會呼叫這個方法,不僅僅是不存在的屬性。
python語法練習 python語法練習
簡單的需求,獲取重複次數最多的資料 沛公import random dict for i in range 1,1000000 rd num random.randrange 0,999,1 if rd num in dict dict rd num dict rd num 1 else dict ...
python語法練習 python基本語法練習
1 列印九九乘法表 只列印結果 for i in range 1,10 for j in range 1,i 1 print i j,end print 列印算數表示式 for i in range 1,10 for j in range 1,i 1 print format j,i,i j end...
Python基礎語法練習2
1.隨機生成5個 100 100之間 包括 100與100 的整數儲存到列表中,按絕對值從小到大排列 若有相同數字,相同數字並列排序即可 並列印輸出列表 import random num list random.randint 100 100 for i in range 5 列表推導式 new ...