'''物件族譜之類物件例項化過程'''
class person(object):
'''獲取物件方法'''
def __new__(cls, *args, **kwargs):
'''物件獲取要點之一: 獲取
當外部進行類名方法呼叫時,會呼叫__new__方法獲取物件例項
但只是獲取,並不一定是建立,也可以返回已經存在的乙個物件
返回的物件也不一定是當前類的例項物件,可以是任何在python中可以稱作是物件的東西
'''# return 3 可以返回乙個int物件,也可以是任何其他物件
'''物件獲取要點之二: 建立
python中建立類例項物件的方法只有一種,object.__new__(cls),cls表示建立的物件依附的類名稱
當子類當中省略該方法時,會自動追尋到父類,呼叫父類的__new__方法進行建立,層級追溯,直到追溯到type中呼叫的object.__new__方法
由此可見,所有的類例項物件都是同樣的原型體,唯一的區別在於以下三點:
1.類名
繫結類名,類之間類名不同
2.屬性
類初始化__init__中定義的屬性不同,不同類屬性存在差異
3.方法
類中定義的方法不同,行為不一致
所以可以說:
物件都是相同的原型,通過類賦予了歸屬名稱,屬性和方法才產生了區分
(物件名稱是程式設計師規定,不在族譜談論範圍)
'''return object.__new__(cls)
'''物件初始化方法'''
def __init__(self):
'''物件初始化要點之一: 初始化物件
進行初始化操作,針對的是當前類的例項物件,確切的說是__new__返回的物件
直接呼叫self指定當前物件例項,通過點(.)指定屬性,直接進行賦值初始化
物件初始化要點之二: 賦予屬性
為__new__方法返回的例項物件新增屬性,有以下三種差異:
1.非當前類物件,但是擁有指定的同名屬性
通過self.attr進行賦值,能夠成功,屬性值會被賦予的新屬性值覆蓋,此物件不屬於該類
2.非當前類物件,不擁有指定的屬性名稱
執行失敗
3.當前類物件初始化
如果__new__的返回值確定是當前類的物件,必然是object.__new__(cls)生成的原型體
直接self.attr進行賦值操作,相當於為原型體新增指定的屬性
原型體的屬性新增完畢之後,可以被賦予不同的值,但是屬性一直存在,除非呼叫del進行刪除
'''self.name = 'judas'
'''物件方法呼叫執行方法'''
def __call__(self, *args, **kwargs):
'''類例項物件進行方法呼叫時執行此方法
但是一般分作兩種場合:
1.一般類定義
一般類當中,該方法屬於diy自定義方法,除非工作當中有明確的規則定義,否則一般都可以隨便定義
自定義操作範圍:
引數的個數也可以自己定義,操作隨意
可以帶返回值,也可以不帶返回值
任意操作,一般方法允許的操作都適用
2.元類定義
元類是類的類,元類的例項物件是乙個類,當類名進行方法呼叫時必須返回乙個物件
至於是建立新的物件還是移植乙個已經存在的物件不做細節要求,同一般類定義中的__new__方法
不過這不是乙個良好的程式設計習慣,不推薦瞎**玩
此方法一般不做要求,可以看做是呼叫方式比較特殊的物件行為方法定義
但是在元類定義中,需要謹慎對待,符合規格
'''print('__call__')
物件例項化過程
1.首先分析一下記憶體空間 棧訪問速度比堆要快,僅次於直接位於cpu中的暫存器 2.物件例項化 1 首先,靜態 塊在載入時就執行了,所以肯定是最先執行的 2 對於非靜態 塊會在構造方法中的 塊之前載入 執行結果 static成員在載入位元組碼檔案到記憶體過程是會被優先執行,靜態成員變數會在方法區優先...
物件例項化過程分析
下面通過乙個簡單經典的demo演示下 class fu public void show class ziextends fu public void show public class test 執行結果 zi.run.0zi cons run1.8zi.run.8例項化步驟 1.jvm會讀取指定...
Java物件例項化過程
jvm會讀取指定路徑下的class檔案,並載入進記憶體,並會先載入其父類 如果有直接的父類的情況下 在堆記憶體中開闢空間,分配位址。並在物件空間中,對物件中的屬性進行預設初始化。呼叫對應的建構函式進行初始化。在建構函式中,第一行會先呼叫父類中的建構函式進行初始化。父類初始化完畢後,再對子類的屬性進行...