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

資訊專欄INFORMATION COLUMN

Python實(shí)例一個(gè)類背后發(fā)生了什么

shusen / 583人閱讀

摘要:好吧,事實(shí)上,類本身也是實(shí)例,當(dāng)然,它們是元類的實(shí)例。中的一切都是對(duì)象,它們要么是類的實(shí)例,要么是元類的實(shí)例,除了。

寫在最前面

一些很重要的知識(shí),我的寫得有點(diǎn)亂,也可以去看這些文章

Python 面向?qū)ο螅ǔ跫?jí)篇)

Python 面向?qū)ο螅ㄟM(jìn)階篇)

深刻理解Python中的元類(metaclass)

首先來看一個(gè)例子,正常情況下我們定義并且實(shí)例一個(gè)類如下

class Foo(object):
?
????def __init__(self):
????????pass
?
obj = Foo()?? # obj是通過Foo類實(shí)例化的對(duì)象

上述代碼中,obj 是通過 Foo 類實(shí)例化的對(duì)象,其實(shí),不僅 obj 是一個(gè)對(duì)象,F(xiàn)oo類本身也是一個(gè)對(duì)象,因?yàn)樵赑ython中一切事物都是對(duì)象。

print type(obj) # 輸出:?Foo?表示,obj 對(duì)象由Foo類創(chuàng)建
print type(Foo) # 輸出:type表示,F(xiàn)oo類對(duì)象由 type 類創(chuàng)建

如果按照一切事物都是對(duì)象的理論:對(duì)象是通過執(zhí)行Foo類的構(gòu)造方法創(chuàng)建,那么Foo類對(duì)象應(yīng)該也是通過執(zhí)行某個(gè)類的 構(gòu)造方法 創(chuàng)建。

兩個(gè)基本的類

這里和有必要提到一下在Python中有兩個(gè)最基本的對(duì)象,,這兩個(gè)對(duì)象是所有對(duì)象的起源。

的類型是(它本身),的父類是

的類型是,沒有父類

在Python對(duì)象系統(tǒng)中,的關(guān)系就像雞和蛋的關(guān)系,不能說誰先于(創(chuàng)建)誰,兩者是相互依賴的,共同構(gòu)成了Python對(duì)象系統(tǒng)的基礎(chǔ).有點(diǎn)難理解,不過沒有關(guān)系,知道有種這么兩個(gè)東西就好了,比較我們也不是設(shè)計(jì)Python的人,沒有必要搞的那么清楚.

類的創(chuàng)建

主要有兩種方式,不過本質(zhì)上都是一樣的,都是通過type類來實(shí)例一個(gè)用戶類

普通方式
Python
1    class Foo(object):
2    ?
3    ????def func(self):
4    ????????print "hello "

特殊方式(type類的構(gòu)造函數(shù))
Python
1    def func(self):
2    ????print "hello "
3    ?
4    Foo = type("Foo",(object,), {"func": func})
5    #type第一個(gè)參數(shù):類名
6    #type第二個(gè)參數(shù):當(dāng)前類的基類
7    #type第三個(gè)參數(shù):類的成員

由上面可以看出來 , Foo類是由type類實(shí)例而來,那么具體的創(chuàng)建的過程是怎么樣的呢,接著往下面看:

來了解幾個(gè)概念

new 和?__init()和__metaclass__:

__new__函數(shù)是實(shí)例一個(gè)類所要調(diào)用的函數(shù),每當(dāng)我們調(diào)用obj = Foo()來實(shí)例一個(gè)類時(shí),都是先調(diào)用__new__()

然后再調(diào)用__init__()函數(shù)初始化實(shí)例. __init__()在__new__()執(zhí)行后執(zhí)行,

類中還有一個(gè)屬性?__metaclass__,其用來表示該類由 誰 來實(shí)例化創(chuàng)建,所以,我們可以為?__metaclass__ 設(shè)置一個(gè)type類的派生類,從而查看 類 創(chuàng)建的過程。

闡述運(yùn)行過程

mytype產(chǎn)生一個(gè)叫做Foo的實(shí)例,主要的原理就是設(shè)置了,__metaclass__=MyTypoe,這樣就指定mytype類來實(shí)例foo類,如果Python沒有找到__metaclass__,它會(huì)繼續(xù)在(父類)中尋找 __metaclass__屬性,并嘗試做和前面同樣的操作。如果Python在任何父類中都找不到__metaclass__,它就會(huì)在模塊層次中去尋找__metaclass__,并嘗試做同樣的操作。如果還是找不到__metaclass__,Python就會(huì)用內(nèi)置的type來創(chuàng)建這個(gè)類對(duì)象。

mytype類中的__new__方法返回了一個(gè)對(duì)象,所有的Python實(shí)例都是這句代碼創(chuàng)建的type.__new__(cls,name,bases,attrs)

mytype的__init__()函數(shù)初始化Foo類,在這里我們可以和在__new__()函數(shù)一樣設(shè)置Foo類的attr屬性,比如類中的方法,字段屬性等

和Foo類的創(chuàng)建過程一樣,studen類繼承了Foo類,所以重復(fù)123步驟,得到一個(gè)studen類

當(dāng)用戶使用Foo()或者studen()來實(shí)例類時(shí),會(huì)默認(rèn)調(diào)用類中的_new_()方法,要是之類里面沒有這個(gè)方法就到父類里面尋找__new__(),我們可以充分利用這個(gè)new函數(shù),比如來實(shí)現(xiàn)Python中的單例模式,或者對(duì)類成員進(jìn)行批量的修改等等.

產(chǎn)生了一個(gè)實(shí)例后馬上執(zhí)行__init__()函數(shù),進(jìn)行初始化實(shí)例,

由上面的運(yùn)行結(jié)果可以看出,其中Foo和studen類的類型是,這也證明了Foo類和studen類都是由MyType實(shí)例而來…而第三個(gè)例子,可以看出Foo2類的類型是,這個(gè)并不例外,Foo2繼承了object類,(這個(gè),還是跳過吧,前面已經(jīng)講過type和object相愛相殺的關(guān)系了)

總結(jié)

首先,你知道了類其實(shí)是能夠創(chuàng)建出類實(shí)例的對(duì)象。好吧,事實(shí)上,類本身也是實(shí)例,當(dāng)然,它們是元類的實(shí)例。Python中的一切都是對(duì)象,它們要么是類的實(shí)例,要么是元類的實(shí)例,除了type。type實(shí)際上是它自己的元類,在純Python環(huán)境中這可不是你能夠做到的,這是通過在實(shí)現(xiàn)層面耍一些小手段做到的。其次,元類是很復(fù)雜的。對(duì)于非常簡(jiǎn)單的類,你可能不希望通過使用元類來對(duì)類做修改。你可以通過其他兩種技術(shù)來修改類:

Monkey patching

class decora

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

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

相關(guān)文章

  • 流暢的python讀書筆記-第三章Python 字典與集合

    摘要:小總結(jié)標(biāo)準(zhǔn)庫里的所有映射類型都是利用來實(shí)現(xiàn)只有可散列的數(shù)據(jù)類型才能用作這些映射里的鍵值不用字典推導(dǎo)用處理找不到的鍵找不到鍵返回某種默認(rèn)值底層是與調(diào)用實(shí)現(xiàn)的字典插入更新原理其他大多數(shù)映射類型都提供了兩個(gè)很強(qiáng)大的方法和。 字典和集合 標(biāo)準(zhǔn)庫里的所有映射類型都是利用 dict 來實(shí)現(xiàn)的只有可散列的數(shù)據(jù)類型才能用作這些映射里的鍵(值不用) 可散列 一個(gè)對(duì)象是可散列的 它的散列值是不變的 對(duì)象...

    lvzishen 評(píng)論0 收藏0
  • 關(guān)于Python屬性與實(shí)例屬性的討論

    摘要:之所以想寫這個(gè)文章是因?yàn)榕銮煽吹骄W(wǎng)上一篇關(guān)于中類屬性及實(shí)例屬性區(qū)別的帖子。中屬性的獲取對(duì)于屬性,我們通常采用類屬性或?qū)嵗龑傩缘男问秸{(diào)用。最關(guān)鍵的地方在于兩點(diǎn)理解是如何利用查找樹的機(jī)制來模仿類及實(shí)例之間的關(guān)系理解動(dòng)態(tài)語言是可以動(dòng)態(tài)設(shè)置屬性的 標(biāo)題名字有點(diǎn)長(zhǎng)。 之所以想寫這個(gè)文章是因?yàn)榕銮煽吹骄W(wǎng)上一篇關(guān)于Pyhon中類屬性及實(shí)例屬性區(qū)別的帖子。因?yàn)槲抑耙脖贿@個(gè)問題困擾過,今天碰巧看到了...

    neroneroffy 評(píng)論0 收藏0
  • 深入NUXT,看看一條命令行的背后到底發(fā)生什么

    摘要:一介紹隨著社區(qū)的框架的發(fā)布,社區(qū)也終于誕生了屬于自己的前后端同構(gòu)框架。本文主要研究的運(yùn)行原理,分析它從接收一條指令,到完成指令背后所發(fā)生的一系列事情。最后,通過來檢查輸出的是否存在問題,然后發(fā)出通知,表明可用。 showImg(https://segmentfault.com/img/bVIc9l?w=536&h=136); 一、介紹 Nuxt.js - Universal Vue.j...

    opengps 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路21-序列構(gòu)成的數(shù)組

    摘要:第行把具名元組以的形式返回。對(duì)序列使用和通常號(hào)兩側(cè)的序列由相同類型的數(shù)據(jù)所構(gòu)成當(dāng)然不同類型的也可以相加,返回一個(gè)新序列。從上面的結(jié)果可以看出,它雖拋出了異常,但仍完成了操作查看字節(jié)碼并不難,而且它對(duì)我們了解代碼背后的運(yùn)行機(jī)制很有幫助。 《流暢的Python》筆記。接下來的三篇都是關(guān)于Python的數(shù)據(jù)結(jié)構(gòu),本篇主要是Python中的各序列類型 1. 內(nèi)置序列類型概覽 Python標(biāo)準(zhǔn)庫...

    ralap 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<