最新整理Python中的type和object的示例詳解
本文是在上篇文章Python中的type和object,做的補(bǔ)充,希望大家喜歡。
這篇博客主要描述Python的新風(fēng)格對(duì)象(new-style objects),如下:
- <type 'type'>和<type 'object'>分別是什么?
- 用戶自定義的類和實(shí)例之間是怎么聯(lián)系的?它們和內(nèi)置類型又是怎么聯(lián)系的?
- 什么是元類(metaclasses)?
New-style表明這篇博客所說(shuō)的內(nèi)容只適用于版本為2.2及以上的python。
開始之前
最主要,是理解type和object的區(qū)別與聯(lián)系。我們平時(shí)用的最多的是Object,比如你定義一個(gè)類時(shí),會(huì)繼承object:
>>> class Test(object): ... pass
這里你定義了一個(gè)自定義類Test
,不難看出,Test
繼承了object
,也就是說(shuō),object
是Test
的超類(或者說(shuō)基類)。
接下來(lái),你可以再定義一個(gè)類:
>>> class subTest(Test): ... pass
subTest
繼承了Test
,同時(shí),因?yàn)?code>Test繼承了object
,所以也可以說(shuō)subTest
繼承了object
。在這里涉及到一個(gè)重要的知識(shí)點(diǎn),那就是繼承具有傳遞性。如果你仔細(xì)觀察,你會(huì)發(fā)現(xiàn)另外一個(gè)知識(shí)點(diǎn),那就是:object
是所有類的超類(這句話至關(guān)重要)。那type是什么呢?它是object的類型(也就是說(shuō)object是type的實(shí)例),同時(shí),object又是type的超類。
“type是object的類型,同時(shí),object又是type的超類”這句話看起來(lái)就充滿疑點(diǎn):那到底是先有object還是先有type呢?其實(shí),“先有object和還是type問(wèn)題”就像“先有雞還是先有蛋問(wèn)題”。到底先有誰(shuí)呢?不急,請(qǐng)繼續(xù)看:
你要明白這些,先要知道,python是面向?qū)ο蟮恼Z(yǔ)言。在python里面,一切皆為對(duì)象。
一切皆為對(duì)象?這里對(duì)于一部分人來(lái)說(shuō),可能不是很容易理解。這么說(shuō)吧,在python里,
int
整形是對(duì)象,整數(shù)2
也是對(duì)象,你定義的函數(shù)啊,類啊都是對(duì)象,你定義的變量也是對(duì)象。總之,你在python里能用到的都可以稱之為對(duì)象。
好了,把python里一切皆為對(duì)象給整明白后,你要明白在面向?qū)ο蟮捏w系中,存在兩種關(guān)系:
- 父子關(guān)系(圖中以實(shí)線描述):這種關(guān)系存在于某個(gè)類(subclass)是另一個(gè)類(superclass)的特別版本之中。通常描述為“子類是一種父類”。比如:蛇是一種爬行動(dòng)物(Snake is a kind of reptile)。其中,蛇(snake)是子類,爬行動(dòng)物(reptile)是父類。蛇擁有爬行動(dòng)物的特征,同時(shí),又擁有標(biāo)志自己是一條蛇的特征。
- 類型實(shí)例關(guān)系(圖中以虛線描述):這種關(guān)系存在于兩個(gè)對(duì)象之中,其中一個(gè)對(duì)象(實(shí)例)是另一個(gè)對(duì)象(類型)的具體實(shí)現(xiàn)。我有一條寵物蛇叫Squasher,那么Squasher就是蛇的一個(gè)實(shí)例。英文描述為:"Squasher is an instance of snake".
用實(shí)線表示父子關(guān)系,是因?yàn)楦概c子的關(guān)系更加“貼實(shí)”。比如有人叫你列出有關(guān)蛇的詞,你可能會(huì)說(shuō)蛇是爬行動(dòng)物
,但你不會(huì)說(shuō)出蛇是Squasher
....
我想如果把上面的兩種關(guān)系用代碼表示出來(lái)你會(huì)更加直觀:
>>> class reptile(object): ... feature = "有標(biāo)志自己是爬行動(dòng)物的特征" ... name = "爬行動(dòng)物" ... >>> class snake(reptile): ... snake_feature = "除了有標(biāo)志自己是爬行動(dòng)物特征,還有自己是蛇的特征" ... name = "蛇" ... >>> Squasher = snake()
class reptile(object)
和class snake(reptile)
就是代表父子關(guān)系。object是reptile的基類,reptile是snake的超類(基類)。這里有沒(méi)有想起來(lái) object
是所有類的超類?Squasher = snake()
是類型實(shí)例關(guān)系。將類snake實(shí)例化就得到了Squasher。
這時(shí)候,有兩條很有用的規(guī)則:
- Dashed Arrow Up Rule:If X is an instance of A, and A is a subclass of B, then X is an instance of B as well.翻譯過(guò)來(lái)應(yīng)該是“虛線向上規(guī)則”:如果X是A的實(shí)例,同時(shí)A又是B的子類,那么,X也是B的實(shí)例。;
- Dashed Arrow Down Rule:If B is an instance of M, and A is a subclass of B, then A is an instance of M as well.翻譯過(guò)來(lái)應(yīng)該是“虛線向下規(guī)則”:如果B是M的實(shí)例,同時(shí)A是B的子類,那么,A也是M的實(shí)例。其實(shí)這條規(guī)則很少會(huì)用到,但卻和這篇博客要講的內(nèi)容息息相關(guān)。我來(lái)略作分析,從“如果B是M的實(shí)例”這句話得出,B是實(shí)例,“A是B的子類” --> B是一個(gè)(父)類。B是實(shí)例,同時(shí)又是一個(gè)類?怎么回事?看完這篇博客,你會(huì)知道答案的。
在這里,我來(lái)解釋一下為什么叫"虛線向上規(guī)則",通過(guò)觀察上圖右邊,我們可以清晰地見(jiàn)到一個(gè)帶箭頭的虛線,從X端出發(fā),射向A端,此時(shí),A端為箭頭端,虛線代表類型實(shí)例關(guān)系,所以A端是類型,即X是A的實(shí)例
(換句話說(shuō),A是X的類型),通過(guò)命令X.__class__
我們可查看X的類型。再看,一條帶箭頭的實(shí)線從A端射向B端,B端是箭頭端,實(shí)線代表父子關(guān)系,所以B端是父類,即A是B的子類
。這時(shí)候,我們通過(guò)將X端射向A端的虛線,向上抬,射向B端(你應(yīng)該可以看到上圖右上方有一條標(biāo)志為implied[這個(gè)單詞意思是隱藏]的向上虛線),就實(shí)現(xiàn)了表述X也是是B的實(shí)例
的目的。也名副其實(shí),虛線向上嘛。虛線向下規(guī)則也可以這樣推出來(lái),我就不演示了。
總的來(lái)說(shuō),面向?qū)ο篌w系里,有兩種關(guān)系,一種是父子關(guān)系,通過(guò)父類與子類來(lái)描述,另一種是類型實(shí)例關(guān)系,通過(guò)類和實(shí)例來(lái)描述。而兩條規(guī)則,是將類之間,類與實(shí)例之間的關(guān)系聯(lián)系在一起。
到這里,可以進(jìn)入主題了。
基本概念
對(duì)象內(nèi)部:The Object Within
上面我們說(shuō)了面向?qū)ο?,那么?duì)象(object)是什么呢?對(duì)象是python的重要核心之一:它是某個(gè)實(shí)體的抽象描述。對(duì)象擁有下面的特征:
- 對(duì)象標(biāo)識(shí)(Identity):同一個(gè)(父)類實(shí)例化出來(lái)的對(duì)象,往往具有許多相同的特征,但是這些具有許多相同特征的對(duì)象肯定都有一個(gè)唯一的對(duì)象標(biāo)識(shí),當(dāng)然,不同父類實(shí)例化出來(lái)的對(duì)象也是用對(duì)象標(biāo)識(shí)作為判斷對(duì)象的條件之一的;
- 值(A value):這意味著對(duì)象包含一堆屬性。我們可以通過(guò)
objectname.attributename
的方式操作屬性; - 類型(A type):每個(gè)對(duì)象都有一個(gè)確切地類型。例如,對(duì)象“2”的類型是
int
; - 一個(gè)或多個(gè)“Bases”(One or more bases):不是所有對(duì)象都有Bases,但一些特殊的對(duì)象會(huì)有,比如:類。Bases類似于面向?qū)ο笳Z(yǔ)言中的“基類”,“超類”。
如果你想知道一個(gè)對(duì)象在內(nèi)存中的位置,你可以調(diào)用id(對(duì)象)
來(lái)查看。在這里,我再次強(qiáng)調(diào),在python中,一切都有對(duì)象的概念。數(shù)字2是對(duì)象,類型int
也是對(duì)象...type
和Bases
(如果它們存在)非常重要,因?yàn)樗鼈兌x了一個(gè)對(duì)象和另一個(gè)對(duì)象之間的關(guān)系。請(qǐng)記住,type
和Bases
本身也是對(duì)象,稍后會(huì)提到。
你也許會(huì)認(rèn)為,對(duì)象有名字,但名字并不是對(duì)象的組成部分。對(duì)象的名字存在于這個(gè)對(duì)象的命名空間(namespace)之外或者是另一個(gè)對(duì)象的屬性。也就是說(shuō):名字和這個(gè)對(duì)象不是存儲(chǔ)在同一個(gè)“地方”
例子:測(cè)試一個(gè)整數(shù)對(duì)象
>>> two = 2 #==>(1) >>> type(two) #==>(2) <class 'int'> >>> type(type(two)) #==>(3) <class 'type'> >>> type(two).__bases__ #==>(4) (<class 'object'>,) >>> dir(two) #==>(5) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
(1):我們?cè)诋?dāng)前命名空間給數(shù)字2分配一個(gè)名字。并將2和“two”綁定在起。
(2):這個(gè)對(duì)象的類型是<class 'int'>
。你會(huì)在其它地方見(jiàn)到類似<type 'int'>
,int
這樣的輸出,其實(shí)它們都是一個(gè)意思。
(3):額,<class 'int'>
的類型是<class 'type'>
.
(4):輸出“類int
”的基類。
(5):列出整型這個(gè)對(duì)象所有的屬性。
可能會(huì)覺(jué)得有點(diǎn)亂,我稍微總結(jié)一下:數(shù)字2是類型int
(一般來(lái)講,在python中“類”和“類型”是同一種東西)的一個(gè)實(shí)例。倒過(guò)來(lái)說(shuō),int
是數(shù)字2的類型。元組(<class 'object'>,)
是類型int
的超類(或說(shuō)父類)。一個(gè)類型的超類可能不止一個(gè),所以用元組表示。
現(xiàn)在,我們引出第一條規(guī)則:
一切皆為對(duì)象
上面說(shuō)的數(shù)字2,類型int,int的超類<class 'object'>
都是對(duì)象。除此之外,你定義的函數(shù),方法...都是對(duì)象。
一塊干凈的畫板
現(xiàn)在我們來(lái)建立python的對(duì)象系統(tǒng)。從一塊干凈的畫板開始...,畫板分為三部分,從左到右,分別代表類的類,類,類的實(shí)例。
我們會(huì)在這個(gè)畫板中開啟我們的學(xué)習(xí)之旅...
關(guān)系(Relationships)
我們談及對(duì)象時(shí),用兩種關(guān)系來(lái)連接各種對(duì)象,使得對(duì)象之間產(chǎn)生聯(lián)系:
- 父子關(guān)系( the subclass-superclass relationship);
- 類型實(shí)例關(guān)系( the type-instance relationship )。
在文章開頭已經(jīng)詳細(xì)討論過(guò)這兩種關(guān)系了。
進(jìn)入對(duì)象( Bring In The Objects)
第一個(gè)對(duì)象
我們測(cè)試兩個(gè)對(duì)象:object
和type
:
例子1:
>>> object #===>(1) <class 'object'> >>> type #===>(2) <class 'type'> >>> type(object) #===>(3) <class 'type'> >>> object.__class__ #===>(4) <class 'type'> >>> object.__bases__ #===>(5) () >>> type.__class__ #===>(6) <class 'type'> >>> type.__bases__ #===>(7) (<class 'object'>,)
(1),(2):python中的兩個(gè)源對(duì)象的名字。我們先前說(shuō)過(guò)type()
是用來(lái)獲對(duì)象的類型的。事實(shí)上,它既是一個(gè)對(duì)象,也是獲取其它對(duì)象的類型的方法。
(3),(4):查看object的類型??吹?strong>object是type的實(shí)例,我們另外也用.__class__
來(lái)核實(shí)它和type()
的輸出是一樣的。
(5):object沒(méi)有超類,因?yàn)樗旧砭褪撬袑?duì)象的超類。
(6),(7):分別輸出type的類型和超類。即,object是type的超類。type的類型是它自己
我們把例子1獲取的信息描述在畫板上:
object和type是python中的兩個(gè)源對(duì)象,當(dāng)我們嘗試介紹它們是就會(huì)陷入“先有雞還是現(xiàn)有蛋”難題,到底先介紹誰(shuí)?事實(shí)上,它們是互相依賴對(duì)方來(lái)定義,所以它們不能分開而論。
繼續(xù)我們的python實(shí)驗(yàn):
>>> isinstance(object,object) #===>(1) True >>> isinstance(type, object) #===>(2) True
(1):發(fā)生了什么?其實(shí)這里利用了虛線向上規(guī)則,type是object的子類,type的實(shí)例自然也是object的實(shí)例。object是type的實(shí)例啊。
(2):這里我參考的英文文檔解釋是:同時(shí)應(yīng)用虛線向上和虛線向下規(guī)則。但我看得一臉懵逼。因?yàn)槲矣X(jué)的這里和(1)一樣啊:type是object的子類,type的實(shí)例自然也是object的實(shí)例。type也是type的實(shí)例啊。
如果你認(rèn)為上面的解釋很混亂,不用理會(huì)它。不影響你理解這篇文章的主要目的。
新概念: type objects
type
和object
都屬于type objects
。type objects翻譯過(guò)來(lái)就是類型對(duì)象了。類型對(duì)象的特征:
- 它們用于表示程序中的抽象數(shù)據(jù)類型。例如,我們定義的一個(gè)類User會(huì)代表系統(tǒng)中所有的用戶。int會(huì)代表系統(tǒng)中所有整形數(shù)字。
- 它們能被繼承。這意味著你可以利用存在的類型對(duì)象創(chuàng)造出新的類型對(duì)象。已經(jīng)存在的類型對(duì)象是新的類型對(duì)象的超類。
- 它們能被實(shí)例化。這意味著你可以利用已經(jīng)存在的類型對(duì)象創(chuàng)造出新的實(shí)例對(duì)象。前者是后者的type。
- 類型對(duì)象的類型是type
- 它們有時(shí)會(huì)被成為類型有時(shí)會(huì)被稱為類。
你沒(méi)有看錯(cuò)。在新版本的python中類
和類型
已經(jīng)是同一樣?xùn)|西了。由一個(gè)很明顯的地方就可以看出來(lái)。__class__
和type()
的輸出是一樣的。
在舊版本的python中,類
是特指用class語(yǔ)句創(chuàng)造出來(lái)的東西。而內(nèi)置類型例如int
一般不會(huì)被認(rèn)為是類
,而是被認(rèn)為是類型。但在新版本中它們是同一樣?xùn)|西了。我覺(jué)得有必要為這個(gè)改變定義一條規(guī)則:
類是類型,類型也是類(Class is Type is Class)
在>=2.3版本的python中,類和類型是同一樣?xùn)|西。
The term type is equivalent to the term class in all version of Python >= 2.3.
類型和非類型(或者說(shuō)類和非類)都是對(duì)象,但只有類型能夠被繼承。非類型擁有具體的值,所以被繼承是毫無(wú)意義的,而且它也不能被繼承。做簡(jiǎn)單的例子,就是類型int
和它的實(shí)例2。int
是類型,2是非類型。你說(shuō)說(shuō),繼承2有什么意義?
是否還是會(huì)疑惑到底社么是類型?什么是非類型?
這里有一條判斷規(guī)則送給你:
如果一個(gè)對(duì)象,它的類型是“<class 'type'>”,那么,它是類型,否則不是。
還記得怎么判斷一個(gè)對(duì)象的類型嗎?沒(méi)錯(cuò)的,__class__和type()隨意你用。
小總結(jié):
- <class 'object'>的類型是<class 'type'>;
- <class 'object'>的父類為空;
- <class 'type'> 的類型是它自己本身;
- <class 'type'> 是<class 'object'>的子類;
- 在python中只要兩種對(duì)象:類型和非類型。非類型也被稱為實(shí)例。這里有英文原句,我不知怎么翻譯了,很容易看懂,但不知如何說(shuō):There are only two kinds of objects in Python: to be unambiguous let's call these types and non-types. Non-types could be called instances, but that term could also refer to a type, since a type is always an instance of another type. Types could also be called classes, and I do call them classes from time to time.
注意我們?cè)诋嫲逯兄划嫵鰞蓚€(gè)對(duì)象的直接關(guān)系,隱藏的關(guān)系就不畫了,節(jié)省我們的精力和畫板尺寸。
更多內(nèi)置對(duì)象
python這條船上可不止只有兩個(gè)源對(duì)象。通過(guò)這兩個(gè)源對(duì)象可以繁育出一堆對(duì)象:
Figure 2.2. 一些內(nèi)置對(duì)象
上圖中的一些內(nèi)置類型,下面通過(guò)例子來(lái)測(cè)試:
>>> list #====>(1) <class 'list'> >>> list.__class__ #====>(2) <class 'type'> >>> list.__bases__ #====>(3) (<class 'object'>,) >>> tuple.__class__,tuple.__bases__ #====>(4) (<class 'type'>, (<class 'object'>,)) >>> dict.__class__,dict.__bases__ #和(4)一樣原理 (<class 'type'>, (<class 'object'>,)) >>> mylist = [1,2,3] #====>(5) >>> mylist.__class__ #====>(6) <class 'list'> >>> mylist.__bases__ #====>(7) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute '__bases__'
(1):內(nèi)置對(duì)象list;
(2):list的類型是<class 'type'>;
(3):list的超類是(<class 'object'>,);
(4):內(nèi)置對(duì)象tuple.tuple的類型和超類分別是:<class 'type'>, (<class 'object'>,);
(5)list的一個(gè)實(shí)例mylist;
(6)實(shí)例mylist的類型是<class 'list'>;
(7)實(shí)例沒(méi)有超類。
我們可以創(chuàng)造一個(gè)tuple或dict的實(shí)例,但我們不能創(chuàng)造一個(gè)mylist的實(shí)例。因?yàn)閙ylist不是一個(gè)類型,它僅僅是一個(gè)實(shí)例。
通過(guò)繼承產(chǎn)生新對(duì)象
內(nèi)置類型是python本身就有的。那么我們?nèi)绾蝿?chuàng)造一個(gè)新的類型呢?
新的類型不能夠憑空產(chǎn)生,它必須依賴已經(jīng)存在的類型,于是,繼承就呼之欲出了。
例子:通過(guò)繼承產(chǎn)生新對(duì)象
# 在 Python 2.x,你得顯式寫出自定義的類繼承于object: class C(object): #====>(1) pass # In Python 3.x,不用顯式寫出object,如果你不寫,則自動(dòng)繼承于object: class C: #====>(2) pass class D(object): pass class E(C, D): #====>(3) pass class MyList(list): #====>(4) pass
(1):class語(yǔ)句告訴python解釋器要通過(guò)一個(gè)存在的類型創(chuàng)造一個(gè)新的類型;
(2):在python3.x可以省略掉(object)。
(3):多重繼承;
(4):大多數(shù)內(nèi)置類型可以被繼承,但不是所有的都可以。
通過(guò)實(shí)例化產(chǎn)生新對(duì)象
Example 2.5.
obj = object() #====>(1) cobj = C() #====>(2) mylist = [1,2,3] #====>(3)
(1),(2):利用類型名()
的方式創(chuàng)造一個(gè)類型的實(shí)例。()
中可能帶參數(shù);
(3):這是python利用內(nèi)置類型創(chuàng)造實(shí)例的語(yǔ)法。沒(méi)什么好說(shuō)的。
注意:僅僅通過(guò)對(duì)<class 'object'>
進(jìn)行子類化,類型C
就自動(dòng)成為<class 'type'>
的實(shí)例。原因在常見(jiàn)疑問(wèn)的第二個(gè)問(wèn)題中。
在以上的操作后,原本空白的畫板可以畫滿了:
常見(jiàn)疑問(wèn)
到這里你頭腦中可能會(huì)有很多疑惑,下面列出其中一些問(wèn)題以及答案,請(qǐng)酌情欣賞。有沒(méi)有提到的請(qǐng)留言,我會(huì)努力搜索答案來(lái)解答:
Q: Python如何真正創(chuàng)建一個(gè)新對(duì)象?
A: 在python中,創(chuàng)造的新對(duì)象有兩種:類型和非類型。類型可被繼承和實(shí)例化。非類型本事就是一個(gè)實(shí)例。當(dāng)python創(chuàng)造新對(duì)象時(shí),它會(huì)用自己本身的類型作為新對(duì)象的類型。一般會(huì)用到兩個(gè)方法__new__()
和__init__()
。所以。每個(gè)對(duì)象都有類型。
Q:實(shí)例化的時(shí)候要指定類型,但是當(dāng)繼承時(shí)python如何知道用哪個(gè)類型?
它查看你繼承的超類,并且使用超類的類型來(lái)作為新對(duì)象的類型。
在大多數(shù)的情況下,<class 'object'>
的子類(和<class 'object'>
的子類的子類等等)的類型都是<class 'type'>
>>> class A(object): ... pass ... >>> class B(A): ... pass ... >>> class C(B): ... pass ... >>> A.__class__, B.__class__, C.__class__ (<class 'type'>, <class 'type'>, <class 'type'>)
Q:我能夠創(chuàng)造一個(gè)新的類型?
A:能,這就得元類出場(chǎng)了,通過(guò)屬性__metaclass__
你可以重新創(chuàng)造一個(gè)類型出來(lái)。這里我簡(jiǎn)單列一個(gè)例子。元類的話下面會(huì)簡(jiǎn)單介紹。
>>> class A(type): ... pass ... >>> class B(object, metaclass=A): ... pass ... >>> class C(B): ... pass ... >>> A.__class__, B.__class__, C.__class__ (<class 'type'>, <class '__main__.A'>, <class '__main__.A'>)
通過(guò)繼承type,我們創(chuàng)造出新的類型<class '__main__.A'>
。
Q:wow!那我可以使用任何的類型作為metaclass的參數(shù)嗎?
A:不能。只有繼承了type的類能夠做為metaclass的參數(shù)。
Q:我應(yīng)該使用metaclass嗎?
不建議使用。高手除外。
準(zhǔn)備結(jié)束
一幅描繪python對(duì)象的圖
我們最后得到一幅由不同對(duì)象組成的地圖:
在大多數(shù)情況之下,我們都是學(xué)習(xí)第二列和第三列的內(nèi)容。至于第一列,那是元類的領(lǐng)域了。不是所有人都要深入學(xué)習(xí)。
來(lái)解釋一下上圖的東西:
- 虛線可以從一列穿過(guò)另一列,例如從實(shí)例所在列穿到類所在列。(<type 'type'>例外);
- 實(shí)線不可以穿過(guò)其他列。再一次地,<type 'type'> -> <type 'object'> 是例外。
- 第三列不允許出現(xiàn)實(shí)線。因?yàn)閷?shí)線代表繼承。第三列地實(shí)例無(wú)法子類化;
- 第三列地對(duì)象也不允許被實(shí)例化;
- 第一,二列包含類型,第三列包含非類型;
- 如果創(chuàng)造一個(gè)繼承<class 'type'>的對(duì)象,那么它會(huì)被放在第一列,即元類。這里繼續(xù)強(qiáng)調(diào),類和類型是一樣的。<class 'type'>和<type 'type'>也是一樣的。
注意:<class 'type'>是所有類型的類型。<class 'object'>也是所有對(duì)象的超類(除了它自己)。
總結(jié)
- 這些內(nèi)容是對(duì)前面的總結(jié):
- 在python中有兩種對(duì)象:
- 類型對(duì)象:可以被實(shí)例化和繼承;非類型對(duì)象:不可以被實(shí)例和繼承。
- <class 'type'>和<class 'object'>是python中的兩個(gè)源對(duì)象。
- 每個(gè)對(duì)象都有類型。用objectname.__class__查看。
- 每個(gè)類型對(duì)象都有超類(object除外),用objectname.__bases__可以查看。
- 通過(guò)繼承產(chǎn)生的新對(duì)象都是類型對(duì)象。繼承是用class語(yǔ)句來(lái)實(shí)現(xiàn)的。
- 通過(guò)實(shí)例化產(chǎn)生的新對(duì)象可能是類型對(duì)象,也可能是非類型對(duì)象。你看下圖,虛線就表示實(shí)例化,第一列和第二列實(shí)例化產(chǎn)生的新對(duì)象就是類型對(duì)象。第三列實(shí)例化產(chǎn)生的新對(duì)象就是非類型對(duì)象。實(shí)例化是通過(guò)調(diào)用操作符
()
來(lái)實(shí)現(xiàn)的。比如你自定義了一個(gè)類myclass
,實(shí)例化就是在myclass
后增加()
操作符完成的。也就是instance_of_myclass=myclass()
。
- 一些python的非類型對(duì)象可以通過(guò)特殊的語(yǔ)法來(lái)創(chuàng)造。例如[1, 2, 3]是list的實(shí)例。
- 在內(nèi)部,python總是使用類型對(duì)象來(lái)創(chuàng)造新對(duì)象。新創(chuàng)造的對(duì)象是該類型對(duì)象的實(shí)例。(在這里,實(shí)例有兩種意思:一通過(guò)繼承產(chǎn)生的子類,二是通過(guò)實(shí)例化產(chǎn)生的具體實(shí)例。但平時(shí)我們說(shuō)的實(shí)例就是只第二種)。python通過(guò)class語(yǔ)句中
指定的超類的類型
來(lái)決定新對(duì)象的類型
。
issubclass(A,B)
返回true
當(dāng)且僅當(dāng):
B在A.__bases__輸出的元組之中;
如果A在Z.__bases__輸出的元組中,issubclass(Z,B)返回true.
isinstance(A,B)
返回true當(dāng)且僅當(dāng):
A.__class__是B,或者issubclass(A.class,B)返回true.
到此這篇關(guān)于最新整理Python中的type和object的示例詳解的文章就介紹到這了,更多相關(guān)Python中的type和object內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python中class(object)的含義是什么以及用法
- Python?TypeError:?‘float‘?object?is?not?subscriptable錯(cuò)誤解決
- Python開發(fā)時(shí)報(bào)TypeError:?‘int‘?object?is?not?iterable錯(cuò)誤的解決方式
- Python源碼學(xué)習(xí)之PyType_Type和PyBaseObject_Type詳解
- Python源碼學(xué)習(xí)之PyObject和PyTypeObject
- python源碼剖析之PyObject詳解
- 關(guān)于Python中object類特殊方法的解釋
相關(guān)文章
Python使用文件鎖實(shí)現(xiàn)進(jìn)程間同步功能【基于fcntl模塊】
這篇文章主要介紹了Python使用文件鎖實(shí)現(xiàn)進(jìn)程間同步功能,結(jié)合實(shí)例形式分析了Python基于fcntl模塊文件鎖功能實(shí)現(xiàn)進(jìn)程間同步的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Python 實(shí)現(xiàn)使用dict 創(chuàng)建二維數(shù)據(jù)、DataFrame
下面小編就為大家分享一篇Python 實(shí)現(xiàn)使用dict 創(chuàng)建二維數(shù)據(jù)、DataFrame,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Requests庫(kù)實(shí)現(xiàn)數(shù)據(jù)抓取與處理功能
本文介紹了Python中常用的第三方庫(kù)Requests的基本用法和高級(jí)功能,我們學(xué)習(xí)了如何發(fā)起HTTP請(qǐng)求、處理響應(yīng)、使用會(huì)話對(duì)象、設(shè)置代理和證書驗(yàn)證等技巧,需要的朋友可以參考下2023-05-05Django+boostrap 美化admin后臺(tái)的操作
這篇文章主要介紹了Django+boostrap 美化admin后臺(tái)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03基于python實(shí)現(xiàn)弱密碼檢測(cè)工具
Python中一個(gè)強(qiáng)大的加密模塊,提供了許多常見(jiàn)的加密算法和工具,本文我們將使用Python編寫一個(gè)弱密碼檢測(cè)工具,感興趣的小伙伴可以了解一下2024-01-01Python warning警告出現(xiàn)的原因及忽略方法
在本篇文章里小編給大家分享的是關(guān)于Python warning警告出現(xiàn)的原因及忽略方法,有需要的朋友們可以學(xué)習(xí)參考下。2020-01-01Python?超簡(jiǎn)潔且詳細(xì)爬取西瓜視頻案例
今天給大家?guī)?lái)一篇爬取西瓜視頻的小教程,很簡(jiǎn)單的幾十行代碼就可以實(shí)現(xiàn)了,每一段代碼都詳細(xì)說(shuō)明了用途,看完你就能夠自己動(dòng)手寫,感興趣的同學(xué)快來(lái)跟著小編往下看吧2021-11-11