Python中類(lèi)型關(guān)系和繼承關(guān)系實(shí)例詳解
本文詳細(xì)介紹了Python中類(lèi)型關(guān)系和繼承關(guān)系。分享給大家供大家參考。具體分析如下:
如果一個(gè)對(duì)象A持有另一個(gè)對(duì)象B的ID,那么檢索到A之后就可以檢索到B,我們就說(shuō)存在一個(gè)A到B的導(dǎo)航。這種導(dǎo)航關(guān)系使得Python中所有對(duì)象之間形成了一個(gè)復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)。
Python程序的運(yùn)行包括:
1. 修改這個(gè)網(wǎng)絡(luò)結(jié)構(gòu);
2. 執(zhí)行有副作用的代碼對(duì)象(code object或者說(shuō)bytecode,見(jiàn)Python Language Reference 3.2)
(副作用是指影響Python虛擬機(jī)之外的設(shè)備,這些代碼都是用C或者別的語(yǔ)言寫(xiě)的,Python寫(xiě)的代碼只能完成第一步的功能。print語(yǔ)句除外。)
Python對(duì)象之間有兩種導(dǎo)航關(guān)系:繼承關(guān)系和類(lèi)型關(guān)系,是Python中最基本的關(guān)系。類(lèi)型關(guān)系說(shuō)明一個(gè)對(duì)象是通過(guò)哪個(gè)對(duì)象創(chuàng)建的;繼承關(guān)系說(shuō)明對(duì)象之間的父子關(guān)系,這種父子關(guān)系在名字的解析過(guò)程中起到作用。這里我首先說(shuō)New Style類(lèi)之間的這兩種關(guān)系,掌握了New Style類(lèi)的關(guān)系后,再來(lái)說(shuō)明Classic類(lèi)就容易了。
首先需要說(shuō)明一下的是內(nèi)置模塊中的type是什么。大家都知道type可以用來(lái)判斷一個(gè)對(duì)象的類(lèi)型,好像是一個(gè)函數(shù)。實(shí)際上在2.2中type是一個(gè)類(lèi),而且不是普通的類(lèi),是一個(gè)可以創(chuàng)建類(lèi)的類(lèi),稱(chēng)為元類(lèi)。你運(yùn)行type(type)試一下,打印的是。type類(lèi)是Python類(lèi)型系統(tǒng)的核心。用type作為一個(gè)判斷類(lèi)型的函數(shù)使用是比較特殊的情況,或許是由歷史原因造成的,用typeof或許更合適。
如何構(gòu)造一個(gè)類(lèi)型
你肯定知道是用class語(yǔ)句。但是實(shí)際上,在Python核心看來(lái),只有一種方式,那就是調(diào)用type的構(gòu)造函數(shù)(因?yàn)閠ype是一個(gè)類(lèi)型)。當(dāng)運(yùn)行:
class A(object): def f(self): print 1
Python解析器就會(huì)執(zhí)行如下代碼所示功能:
def f(self): print 1 A=type('A', (object,), ) # 參數(shù)為(名字, 父類(lèi)tuple,成員dict) del f
兩者效果幾乎是一樣的,你可以試一下。
類(lèi)型關(guān)系的確定除了使用type之外,還可以使用__class__屬性。如:
class A(object): pass a=A() a.__class__ # 'class __main__.A' A.__class__ # 'type ' type.__class__ # 'type ' type.__class__.__class__ # 'type ' type.__class__ is type.__class.__class__ # True
繼承關(guān)系
繼承關(guān)系只發(fā)生在類(lèi)型之間,繼承關(guān)系構(gòu)成一個(gè)有向圖。所有的類(lèi)型都是從object繼承來(lái)的?!八械摹碑?dāng)然也包括type。object的父類(lèi)還是object。object作為一個(gè)類(lèi)型對(duì)象也是有其類(lèi)型的,這個(gè)類(lèi)型就是type。所以object和type之間的關(guān)系就好比先有雞還是先有蛋的問(wèn)題了:type是從object繼承的(繼承關(guān)系);object是由type生成的(類(lèi)型關(guān)系)。通過(guò)issubclass或者_(dá)_bases__屬性來(lái)判斷兩個(gè)類(lèi)之間的繼承關(guān)系。
那么從type繼承意味著什么呢?那意味著這個(gè)類(lèi)的類(lèi)型是type,同時(shí)父類(lèi)也是type。但是這種做法在一般的編程中是沒(méi)有什么意義的(卻是meta programmming的核心)。因?yàn)橐话愣加胏lass語(yǔ)句,而不是通過(guò)調(diào)用type的構(gòu)造函數(shù)來(lái)創(chuàng)建類(lèi)型對(duì)象。為了說(shuō)明語(yǔ)法還是舉個(gè)例子:
class mytype(type): pass A=mytype('A', (object,), {}) # del f A.__class__ # class '__main__.mytype',元類(lèi)為mytype mytype.__class__ # 'type '
在用class定義一個(gè)類(lèi)時(shí),會(huì)間接調(diào)用type的構(gòu)造函數(shù)。但是通過(guò)設(shè)置__metaclass__屬性,可以不去調(diào)用type,而是調(diào)用type的子類(lèi)。如:
class A(object): __metaclass__ = mytype A.__class__ # class '__main__.mytype' ,和上面的方式結(jié)果一樣。
由此,Python對(duì)象的類(lèi)型關(guān)系組成了一個(gè)樹(shù)型結(jié)構(gòu),其中type處于樹(shù)的根部,由type或者type的子類(lèi)構(gòu)造的類(lèi)型,包括class定義的類(lèi)(間接調(diào)用type),調(diào)用type、type的子類(lèi)構(gòu)造函數(shù)創(chuàng)建的類(lèi),int list等系統(tǒng)定義類(lèi)型處于中間節(jié)點(diǎn),葉節(jié)點(diǎn)為instance對(duì)象。type本身的類(lèi)型是什么呢?還是type。這和根目錄的父目錄還是根目錄是一樣的。
Classic類(lèi)不同于New Style類(lèi)的地方就是當(dāng)用class創(chuàng)建一個(gè)類(lèi)時(shí),不是間接調(diào)用type,而是間接調(diào)用types.ClassType,而types.ClassType是由type創(chuàng)建的。
class A: pass type(A) # type 'classobj',注意沒(méi)有__class__屬性。 type(A) is types.ClassType # True types.ClassType.__class__ # 'type'
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python中copy()與deepcopy()的區(qū)別小結(jié)
接觸python有一段時(shí)間了,一直沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò),也對(duì)copy,deepcoy傻傻的分不清,故抽出時(shí)間來(lái)理一下。 下面這篇文章主要給大家介紹了關(guān)于python中copy()與deepcopy()的區(qū)別的相關(guān)資料,需要的朋友可以參考下2018-08-08詳解Python常用標(biāo)準(zhǔn)庫(kù)之時(shí)間模塊time和datetime
time和datetime是Python中常用的兩個(gè)時(shí)間模塊,本文將通過(guò)示例詳細(xì)為大家講講二者的使用方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)2022-05-05Python設(shè)計(jì)模式結(jié)構(gòu)型享元模式
這篇文章主要介紹了Python享元模式,享元模式即Flyweight Pattern,指運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象,下面和小編一起進(jìn)入文章了解更多詳細(xì)內(nèi)容吧2022-02-02互斥鎖解決 Python 中多線(xiàn)程共享全局變量的問(wèn)題(推薦)
這篇文章主要介紹了互斥鎖解決 Python 中多線(xiàn)程共享全局變量的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09pyqt彈出新對(duì)話(huà)框,以及關(guān)閉對(duì)話(huà)框獲取數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇pyqt彈出新對(duì)話(huà)框,以及關(guān)閉對(duì)話(huà)框獲取數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06python實(shí)現(xiàn)畫(huà)一顆樹(shù)和一片森林
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)畫(huà)一顆樹(shù)和一片森林,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06使用Python實(shí)現(xiàn)給企業(yè)微信發(fā)送消息功能
本文將介紹如何使用python3給企業(yè)微信發(fā)送消息,文中有詳細(xì)的圖文解說(shuō)及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴很有幫助,需要的朋友可以參考下2021-12-12