成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

由type()函數(shù)對類和實例使用結(jié)果差異而引出的一個問題

zhangwang / 1264人閱讀

摘要:但是隨后有人提出反對意見并說這個是隨后搜索到這篇文章深刻理解中的元類里面介紹了如何使用函數(shù)創(chuàng)建一個類,并解釋了屬性。

有如下代碼

#-*-coding:utf-8-*-
class a():
    pass
a1 = a()
print(type(a),type(a1))

兩個python版本分別為
Python2.7.11
Python3.5.1

在python2中得到的結(jié)果
(, )
a是一個類對象,a1是一個實例

在python3中得到的結(jié)果

a是一個type?,a1是a的一個實例

在python3中對一個類對象使用type()會得到type這個結(jié)果?

解釋?

有人這樣回答:

這是因為type函數(shù)可以創(chuàng)建類
其實class本質(zhì)上就是type函數(shù)
class的定義是運行時動態(tài)創(chuàng)建的,而創(chuàng)建class的方法就是使用type()函數(shù)。


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函數(shù)創(chuàng)建類的實例
要創(chuàng)建一個class對象,type()函數(shù)依次傳入3個參數(shù):

class的名稱; 繼承的父類集合,注意Python支持多重繼承,如果只有一個父類,別忘了tuple的單元素寫法;
class的方法名稱與函數(shù)綁定,這里我們把函數(shù)fn綁定到方法名hello上。

但是隨后有人提出反對意見并說這個是metaclass,隨后搜索到這篇文章

深刻理解Python中的元類(metaclass) http://blog.jobbole.com/21351/

里面介紹了如何使用type函數(shù)創(chuàng)建一個類(MyClass = type("MyClass", (), {})),并解釋了__metaclass__屬性。

函數(shù)type實際上是一個元類
當(dāng)定義了一個類

class Foo(Bar):
    pass

Python做了如下的操作:

Foo中有__metaclass__這個屬性嗎?如果是,Python會在內(nèi)存中通過__metaclass__創(chuàng)建一個名字為Foo的類對象(我說的是類對象,請緊跟我的思路)。如果Python沒有找到__metaclass__,它會繼續(xù)在Bar(父類)中尋找__metaclass__屬性,并嘗試做和前面同樣的操作。如果Python在任何父類中都找不到__metaclass__,它就會在模塊層次中去尋找__metaclass__,并嘗試做同樣的操作。如果還是找不到__metaclass__,Python就會用內(nèi)置的type來創(chuàng)建這個類對象。

因此,元類就是用來創(chuàng)建類的玩意。 type就是Python的內(nèi)建元類(和str,int類似的性質(zhì)),你也可以創(chuàng)建自己的元類。
具體方法上面的文章中已經(jīng)有了。

“元類就是深度的魔法,99%的用戶應(yīng)該根本不必為此操心。如果你想搞清楚究竟是否需要用到元類,那么你就不需要它。那些實際用到元類的人都非常清楚地知道他們需要做什么,而且根本不需要解釋為什么要用元類?!?br>—— Python界的領(lǐng)袖 Tim Peters

感覺還是不要去碰的比較好。。。。。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38498.html

相關(guān)文章

  • Python實例一個類背后發(fā)生了什么

    摘要:好吧,事實上,類本身也是實例,當(dāng)然,它們是元類的實例。中的一切都是對象,它們要么是類的實例,要么是元類的實例,除了。 寫在最前面 一些很重要的知識,我的寫得有點亂,也可以去看這些文章 Python 面向?qū)ο螅ǔ跫壠?Python 面向?qū)ο螅ㄟM階篇) 深刻理解Python中的元類(metaclass) 首先來看一個例子,正常情況下我們定義并且實例一個類如下 class Foo(ob...

    shusen 評論0 收藏0
  • C++類和對象(萬字總結(jié))(建議收藏?。。。?/b>

    摘要:當(dāng)你用該日期類創(chuàng)建一個對象時,編譯器會自動調(diào)用該構(gòu)造函數(shù)對新創(chuàng)建的變量進行初始化。注意構(gòu)造函數(shù)的主要任務(wù)并不是開空間創(chuàng)建對象,而是初始化對象。編譯器對內(nèi)置類型使用默認構(gòu)造函數(shù)時,對其成員賦的是隨機值。 ...

    masturbator 評論0 收藏0
  • JavaScript_設(shè)計模式

    摘要:設(shè)計模式是一套可復(fù)用的,被眾人知曉,經(jīng)過編目分明的,經(jīng)驗的總結(jié)。創(chuàng)建類安全工廠判斷是否調(diào)用關(guān)鍵字設(shè)計模式設(shè)計模式運算符可以用來判斷某個構(gòu)造函數(shù)的屬性所指向的對象是否存在于另外一個要檢測對象的原型鏈上。 設(shè)計模式 是一套可復(fù)用的,被眾人知曉,經(jīng)過編目分明的,經(jīng)驗的總結(jié)。作用:使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性 模式類型 創(chuàng)建型設(shè)計模式:解決對象在創(chuàng)建時產(chǎn)...

    BDEEFE 評論0 收藏0
  • SICP Python 描述 2.6 實現(xiàn)類和對象

    摘要:以這種方式實現(xiàn)對象系統(tǒng)的目的是展示使用對象隱喻并不需要特殊的編程語言。我們的實現(xiàn)并不遵循類型系統(tǒng)的明確規(guī)定。反之,它為實現(xiàn)對象隱喻的核心功能而設(shè)計。是分發(fā)字典,它響應(yīng)消息和。 2.6 實現(xiàn)類和對象 來源:2.6 Implementing Classes and Objects 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 在使用面向?qū)ο缶幊谭妒綍r,我們使用對象隱喻來指導(dǎo)程序...

    chenjiang3 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<