物件族譜之類物件例項化過程

2021-08-08 10:57:42 字數 1848 閱讀 9764

'''物件族譜之類物件例項化過程'''

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檔案,並載入進記憶體,並會先載入其父類 如果有直接的父類的情況下 在堆記憶體中開闢空間,分配位址。並在物件空間中,對物件中的屬性進行預設初始化。呼叫對應的建構函式進行初始化。在建構函式中,第一行會先呼叫父類中的建構函式進行初始化。父類初始化完畢後,再對子類的屬性進行...