欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年02月09日 16:58:39   作者:outshineamaze  
Python實(shí)例一個(gè)類背后發(fā)生了什么,本文為大家一一列出,感興趣的朋友可以參考一下

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

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

上述代碼中,obj 是通過(guò) 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ì)象是通過(guò)執(zhí)行Foo類的構(gòu)造方法創(chuàng)建,那么Foo類對(duì)象應(yīng)該也是通過(guò)執(zhí)行某個(gè)類的 構(gòu)造方法 創(chuàng)建。

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

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

二、類的創(chuàng)建
主要有兩種方式,不過(guò)本質(zhì)上都是一樣的,都是通過(guò)type類來(lái)實(shí)例一個(gè)用戶類

//普通方式
  class Foo(object):
   
  def func(self):
  print 'hello wupeiqi'

//特殊方式(type類的構(gòu)造函數(shù))
  def func(self):
    print 'hello wupeiqi'
  
  Foo = type('Foo',(object,), {'func': func})
 #type第一個(gè)參數(shù):類名
 #type第三個(gè)參數(shù):類的成員

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

來(lái)了解幾個(gè)概念
new __init()__metaclass__:

  • __new__函數(shù)是實(shí)例一個(gè)類所要調(diào)用的函數(shù),每當(dāng)我們調(diào)用obj = Foo()來(lái)實(shí)例一個(gè)類時(shí),都是先調(diào)用__new__()
  • 然后再調(diào)用__init__()函數(shù)初始化實(shí)例. __init__()在__new__()執(zhí)行后執(zhí)行,
  • 類中還有一個(gè)屬性 __metaclass__,其用來(lái)表示該類由 誰(shuí) 來(lái)實(shí)例化創(chuàng)建,所以,我們可以為 __metaclass__ 設(shè)置一個(gè)type類的派生類,從而查看 類 創(chuàng)建的過(guò)程。

三、闡述運(yùn)行過(guò)程

1、mytype產(chǎn)生一個(gè)叫做Foo的實(shí)例,主要的原理就是設(shè)置了,__metaclass__=MyTypoe,這樣就指定mytype類來(lái)實(shí)例foo類,如果Python沒(méi)有找到__metaclass__,它會(huì)繼續(xù)在(父類)中尋找 __metaclass__屬性,并嘗試做和前面同樣的操作。如果Python在任何父類中都找不到__metaclass__,它就會(huì)在模塊層次中去尋找__metaclass__,并嘗試做同樣的操作。如果還是找不到__metaclass__,Python就會(huì)用內(nèi)置的type來(lái)創(chuàng)建這個(gè)類對(duì)象。
2、mytype類中的__new__方法返回了一個(gè)對(duì)象,所有的Python實(shí)例都是這句代碼創(chuàng)建的type.__new__(cls,name,bases,attrs)
3、mytype的__init__()函數(shù)初始化Foo類,在這里我們可以和在__new__()函數(shù)一樣設(shè)置Foo類的attr屬性,比如類中的方法,字段屬性等
4、和Foo類的創(chuàng)建過(guò)程一樣,studen類繼承了Foo類,所以重復(fù)123步驟,得到一個(gè)studen類
5、當(dāng)用戶使用Foo()或者studen()來(lái)實(shí)例類時(shí),會(huì)默認(rèn)調(diào)用類中的_new_()方法,要是之類里面沒(méi)有這個(gè)方法就到父類里面尋找__new__(),我們可以充分利用這個(gè)new函數(shù),比如來(lái)實(shí)現(xiàn)Python中的單例模式,或者對(duì)類成員進(jìn)行批量的修改等等.
6、產(chǎn)生了一個(gè)實(shí)例后馬上執(zhí)行__init__()函數(shù),進(jìn)行初始化實(shí)例,
7、由上面的運(yùn)行結(jié)果可以看出,其中Foo和studen類的類型是<class '__main__.MyType'>,這也證明了Foo類和studen類都是由MyType實(shí)例而來(lái)…而第三個(gè)例子,可以看出Foo2類的類型是<type 'type'>,這個(gè)并不例外,Foo2繼承了object類,(這個(gè),還是跳過(guò)吧,前面已經(jīng)講過(guò)type和object相愛(ài)相殺的關(guān)系了)
總結(jié)
首先,你知道了類其實(shí)是能夠創(chuàng)建出類實(shí)例的對(duì)象。好吧,事實(shí)上,類本身也是實(shí)例,當(dāng)然,它們是元類的實(shí)例。Python中的一切都是對(duì)象,它們要么是類的實(shí)例,要么是元類的實(shí)例,除了type。type實(shí)際上是它自己的元類,在純Python環(huán)境中這可不是你能夠做到的,這是通過(guò)在實(shí)現(xiàn)層面耍一些小手段做到的。其次,元類是很復(fù)雜的。對(duì)于非常簡(jiǎn)單的類,你可能不希望通過(guò)使用元類來(lái)對(duì)類做修改。你可以通過(guò)其他兩種技術(shù)來(lái)修改類:

1、Monkey patching
2、class decora

以上就是本文的詳細(xì)內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評(píng)論