摘要:但是隨后有人提出反對意見并說這個是隨后搜索到這篇文章深刻理解中的元類里面介紹了如何使用函數創建一個類,并解釋了屬性。
有如下代碼
#-*-coding:utf-8-*- class a(): pass a1 = a() print(type(a),type(a1))
兩個python版本分別為
Python2.7.11
Python3.5.1
在python2中得到的結果
(
a是一個類對象,a1是一個實例
在python3中得到的結果
a是一個type?,a1是a的一個實例
在python3中對一個類對象使用type()會得到type這個結果?
解釋?有人這樣回答:
這是因為type函數可以創建類 其實class本質上就是type函數 class的定義是運行時動態創建的,而創建class的方法就是使用type()函數。 In [2]: def fn(self,name = "world"): ...: print("hello,%s" % name) ...: In [3]: Hello = type("Hello", (object,), dict(hello=fn)) In [4]: h = Hello() In [5]: h.hello() hello,world In [6]: print(type(Hello))In [7]: print(type(h)) 這就是用type函數創建類的實例
要創建一個class對象,type()函數依次傳入3個參數:class的名稱; 繼承的父類集合,注意Python支持多重繼承,如果只有一個父類,別忘了tuple的單元素寫法;
class的方法名稱與函數綁定,這里我們把函數fn綁定到方法名hello上。
但是隨后有人提出反對意見并說這個是metaclass,隨后搜索到這篇文章
深刻理解Python中的元類(metaclass) http://blog.jobbole.com/21351/
里面介紹了如何使用type函數創建一個類(MyClass = type("MyClass", (), {})),并解釋了__metaclass__屬性。
函數type實際上是一個元類
當定義了一個類
class Foo(Bar): pass
Python做了如下的操作:
Foo中有__metaclass__這個屬性嗎?如果是,Python會在內存中通過__metaclass__創建一個名字為Foo的類對象(我說的是類對象,請緊跟我的思路)。如果Python沒有找到__metaclass__,它會繼續在Bar(父類)中尋找__metaclass__屬性,并嘗試做和前面同樣的操作。如果Python在任何父類中都找不到__metaclass__,它就會在模塊層次中去尋找__metaclass__,并嘗試做同樣的操作。如果還是找不到__metaclass__,Python就會用內置的type來創建這個類對象。
因此,元類就是用來創建類的玩意。 type就是Python的內建元類(和str,int類似的性質),你也可以創建自己的元類。
具體方法上面的文章中已經有了。
“元類就是深度的魔法,99%的用戶應該根本不必為此操心。如果你想搞清楚究竟是否需要用到元類,那么你就不需要它。那些實際用到元類的人都非常清楚地知道他們需要做什么,而且根本不需要解釋為什么要用元類。”
—— Python界的領袖 Tim Peters
感覺還是不要去碰的比較好。。。。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38498.html
摘要:好吧,事實上,類本身也是實例,當然,它們是元類的實例。中的一切都是對象,它們要么是類的實例,要么是元類的實例,除了。 寫在最前面 一些很重要的知識,我的寫得有點亂,也可以去看這些文章 Python 面向對象(初級篇) Python 面向對象(進階篇) 深刻理解Python中的元類(metaclass) 首先來看一個例子,正常情況下我們定義并且實例一個類如下 class Foo(ob...
摘要:當你用該日期類創建一個對象時,編譯器會自動調用該構造函數對新創建的變量進行初始化。注意構造函數的主要任務并不是開空間創建對象,而是初始化對象。編譯器對內置類型使用默認構造函數時,對其成員賦的是隨機值。 ...
摘要:設計模式是一套可復用的,被眾人知曉,經過編目分明的,經驗的總結。創建類安全工廠判斷是否調用關鍵字設計模式設計模式運算符可以用來判斷某個構造函數的屬性所指向的對象是否存在于另外一個要檢測對象的原型鏈上。 設計模式 是一套可復用的,被眾人知曉,經過編目分明的,經驗的總結。作用:使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性 模式類型 創建型設計模式:解決對象在創建時產...
摘要:以這種方式實現對象系統的目的是展示使用對象隱喻并不需要特殊的編程語言。我們的實現并不遵循類型系統的明確規定。反之,它為實現對象隱喻的核心功能而設計。是分發字典,它響應消息和。 2.6 實現類和對象 來源:2.6 Implementing Classes and Objects 譯者:飛龍 協議:CC BY-NC-SA 4.0 在使用面向對象編程范式時,我們使用對象隱喻來指導程序...
閱讀 2066·2021-09-22 15:54
閱讀 1830·2021-09-04 16:40
閱讀 854·2019-08-30 15:56
閱讀 2623·2019-08-30 15:44
閱讀 2150·2019-08-30 13:52
閱讀 1120·2019-08-29 16:35
閱讀 3340·2019-08-29 16:31
閱讀 2562·2019-08-29 13:48