国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實例一個類背后發生了什么

2020-01-04 17:46:36
字體:
來源:轉載
供稿:網友
Python實例一個類背后發生了什么,本文為大家一一列出,感興趣的朋友可以參考一下
 

首先來看一個例子,正常情況下我們定義并且實例一個類如下

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

上述代碼中,obj 是通過 Foo 類實例化的對象,其實,不僅 obj 是一個對象,Foo類本身也是一個對象,因為在Python中一切事物都是對象。

print type(obj) # 輸出: Foo 表示,obj 對象由Foo類創建
print type(Foo) # 輸出:type表示,Foo類對象由 type 類創建
如果按照一切事物都是對象的理論:對象是通過執行Foo類的構造方法創建,那么Foo類對象應該也是通過執行某個類的 構造方法 創建。

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

1、<type ‘type'>的類型是<type ‘type'>(它本身),<type ‘type'>的父類是<type ‘object'>
2、<type ‘object'>的類型是<type ‘type'>,<type ‘object'>沒有父類
在Python對象系統中,<type ‘object'>和<type ‘type'>的關系就像雞和蛋的關系,不能說誰先于(創建)誰,兩者是相互依賴的,共同構成了Python對象系統的基礎.有點難理解,不過沒有關系,知道有種這么兩個東西就好了,比較我們也不是設計Python的人,沒有必要搞的那么清楚.

二、類的創建
主要有兩種方式,不過本質上都是一樣的,都是通過type類來實例一個用戶類

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

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

來了解幾個概念
new 和 __init()__metaclass__:

  • __new__函數是實例一個類所要調用的函數,每當我們調用obj = Foo()來實例一個類時,都是先調用__new__()
  • 然后再調用__init__()函數初始化實例. __init__()在__new__()執行后執行,
  • 類中還有一個屬性 __metaclass__,其用來表示該類由 誰 來實例化創建,所以,我們可以為 __metaclass__ 設置一個type類的派生類,從而查看 類 創建的過程。

三、闡述運行過程

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

1、Monkey patching
2、class decora

以上就是本文的詳細內容,希望對大家的學習有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉安县| 睢宁县| 酒泉市| 武穴市| 桓仁| 苍梧县| 卓资县| 红原县| 芜湖市| 桃江县| 东方市| 奉节县| 巫山县| 开封县| 大同市| 乌拉特中旗| 通山县| 勃利县| 晋城| 南宁市| 太仆寺旗| 奈曼旗| 郴州市| 邢台县| 新巴尔虎右旗| 赣州市| 阿拉尔市| 邮箱| 灵武市| 阳城县| 平罗县| 曲靖市| 玛多县| 怀仁县| 眉山市| 万载县| 甘孜县| 恭城| 莱州市| 普安县| 河间市|