剛學物件導向的時候,其他啥也沒記住,就記住乙個__init__方法,當時就感覺這方法很牛皮,能搞乙個物件出來,但是直到有一天手賤點object原始碼看,才發現自己一直都是錯的。
create and return new object,人家清清楚楚的寫著,是我建立的物件。
那行吧,我隱約的認識到是__new__建立的物件,__init__只是賦了屬性,
以**為準,自己搞一下來看看
classa(
object):
def__new__
(cls,
*args,
**kwargs)
:print
(cls.__name__)
#看看這個cls是誰
print
("是我建立的物件"
) a =
object
.__new__(cls)
#要依靠object基類的方法
a.name =
"a"print(id
(a))
#看看這建立的物件是否與下邊例項化出來的物件是乙個東西
return a
def__init__
(self,age)
:print
(self.name)
#看看這個self是誰
self.age = age
print
("我負責給物件屬性"
) m = a(1)
print(id
(m))
執行結果:
來分析一下:
1.因為先出現"我建立的物件",所以__new__先於__init__執行
2.傳入__new__是a這個類,那麼呼叫object返回的物件就是a類的例項
3.__new__建立的物件的id與傳入__init__的物件的id以及類例項化之後的物件的id一樣,他們三個是同乙個東西
好了,到了這,基本流程我們也能看出來了:
首先乙個類例項化乙個物件時,先呼叫__new__來建立乙個物件(沒有任何屬性),之後__init__拿到這個物件後給物件屬性。
物件的建立過程
jvm查詢類的路徑,定位到.class檔案 載入.class檔案,有關靜態初始化的所有動作都會被執行 靜態初始化只在物件首次載入的時候進行一次 當用new建立物件的時候,在堆上為物件分配足夠的空間 儲存空間將會被初始化,自動為物件的所有基本資料型別設定成預設值,引用被置為null 執行所有出現於字段...
物件的建立過程
直接上 public class sup public sup static package com.test.resources public class sub extends sup public sub static public class test 父類靜態 塊 在父類的無參構造上面 父...
物件建立過程
過程一共有五步 類載入檢查 分配記憶體 初始化零值 設定物件頭 執行init 類載入檢查 檢查該物件所代表的的類是否已經被載入 解析和初始化過,沒有的話先執行類的載入過程 分配記憶體 在通過第一之後虛擬機器為物件分配記憶體。物件經過類載入之後大小就基本確定了,分配空間就是在堆中劃出一塊大小確定的記憶...