使用type動態定義類,
內置type()函數在傳遞了一個參數時將返回一個對象的類型。對于新式類,通常與對象的class屬性相
同:
type(name, bases, dict)調用type(),type傳參的規則如下:
name:指定類名稱,將成為該類的name屬性。
bases:指定繼承類的基類元組,將成為該類的bases屬性。
dict:指定包含類主體定義的名稱空間字典,將成為該類的dict屬性。
在你提供的代碼中,通過 type() 動態創建了 User 類,并且為其定義了 move 方法。為了能夠通過 user_instance.move() 調用 move 方法,關鍵在于這個方法是作為 User 類的一個成員方法存在的。由于 type() 生成的類會將 move 方法放入類的 __dict__ 屬性中,move 方法會成為 User 類的一個成員函數,而你通過 user_instance 創建的實例就可以訪問它。
讓我們逐步分析代碼:
def move(self):
print('---move----方法')
# 使用 type 動態創建一個 User 類
User = type('User', (), {'name': '小明', 'move': move}) # 這個字典里面的第二個參數,key用的move,value用的是一個move函數,加括號()可以實例化執行。
# 創建 User 類的實例
user_instance = User()
# 訪問屬性和方法
print(user_instance.name) # 輸出:小明
user_instance.move() # 輸出:---move----方法
關鍵解釋:
1.def move(self):
這里定義了一個方法 move,它接收 self 作為參數,并打印出一條信息 '---move----方法'。
2.User = type('User', (), {'name': '小明', 'move': move})
這一行使用 type() 動態創建了一個新的類 User。
type(name, bases, dict)調用type(),type傳參的規則如下:
name:指定類名稱,將成為該類的name屬性。
bases:指定繼承類的基類元組,將成為該類的bases屬性。
dict:指定包含類主體定義的名稱空間字典,將成為該類的dict屬性。
3.'User' 是類名,即 User.__name__ = 'User'。
4.() 為空元組,表示該類沒有父類,默認繼承自 object。
5.{'name': '小明', 'move': move} 是一個字典,包含類的屬性和方法:
6.name 屬性被賦值為 '小明'。
7.move 方法被賦值為上面定義的 move 函數。
8.user_instance = User()
通過 User() 創建了 User 類的實例 user_instance。此時,user_instance 繼承了 User 類的屬性和方法。
9.user_instance.name 將返回 '小明',因為 name 是類的一個屬性。
10.user_instance.move() 調用的是 move 方法,輸出 ---move----方法。
為什么可以調用 move() 方法?
當你通過 type() 創建 User 類時,move 方法被作為類的一個成員方法放入了類的 __dict__ 中。因此,User 類的實例(如 user_instance)可以訪問該方法。
在實例化時,Python 會查找 user_instance 的類,發現它是 User 類的實例。由于 User 類的 __dict__ 包含了 move 方法,Python 會將該方法綁定到 user_instance 上(通過 self 參數),使得可以通過 user_instance.move() 調用。
這與普通的類定義類似,只是這里我們使用了 type() 來動態生成類和方法。
小結:
通過 type() 創建類時,方法 move 被添加到類的字典(__dict__)中。類的實例 user_instance 繼承了這個方法,因此可以通過 user_instance.move() 調用該方法。