真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python中type和object有什么用-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)python中type和object有什么用,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)建站專注于疏附網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供疏附營銷型網(wǎng)站建設(shè),疏附網(wǎng)站制作、疏附網(wǎng)頁設(shè)計(jì)、疏附網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造疏附網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供疏附網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

開始之前

最主要,是理解type和object的區(qū)別與聯(lián)系。我們平時(shí)用的最多的是Object,比如你定義一個(gè)類時(shí),會(huì)繼承object:

python中type和object有什么用

這里你定義了一個(gè)自定義類Test,不難看出,Test繼承了object,也就是說,object是Test的超類(或者說基類)。

接下來,你可以再定義一個(gè)類:

python中type和object有什么用

subTest繼承了Test,同時(shí),因?yàn)門est繼承了object,所以也可以說subTest繼承了object。在這里涉及到一個(gè)重要的知識(shí)點(diǎn),那就是繼承具有傳遞性。如果你仔細(xì)觀察,你會(huì)發(fā)現(xiàn)另外一個(gè)知識(shí)點(diǎn),那就是:object是所有類的超類(這句話至關(guān)重要)。那type是什么呢?它是object的類型(也就是說object是type的實(shí)例),同時(shí),object又是type的超類。

“type是object的類型,同時(shí),object又是type的超類”這句話看起來就充滿疑點(diǎn):那到底是先有object還是先有type呢?其實(shí),“先有object和還是type問題”就像“先有雞還是先有蛋問題”。到底先有誰呢?不急,請繼續(xù)看:

你要明白這些,先要知道,python是面向?qū)ο蟮恼Z言。在python里面,一切皆為對象。

一切皆為對象?這里對于一部分人來說,可能不是很容易理解。這么說吧,在python里,int×××是對象,整數(shù)2也是對象,你定義的函數(shù)啊,類啊都是對象,你定義的變量也是對象??傊?,你在python里能用到的都可以稱之為對象。

好了,把python里一切皆為對象給整明白后,你要明白在面向?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è)對象之中,其中一個(gè)對象(實(shí)例)是另一個(gè)對象(類型)的具體實(shí)現(xiàn)。我有一條寵物蛇叫Squasher,那么Squasher就是蛇的一個(gè)實(shí)例。英文描述為:"Squasher is an instance of snake".

python中type和object有什么用

用實(shí)線表示父子關(guān)系,是因?yàn)楦概c子的關(guān)系更加“貼實(shí)”。比如有人叫你列出有關(guān)蛇的詞,你可能會(huì)說蛇是爬行動(dòng)物,但你不會(huì)說出蛇是Squasher....

我想如果把上面的兩種關(guān)系用代碼表示出來你會(huì)更加直觀:

python中type和object有什么用

class reptile(object)和class snake(reptile)就是代表父子關(guān)系。object是reptile的基類,reptile是snake的超類(基類)。這里有沒有想起來 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.翻譯過來應(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.翻譯過來應(yīng)該是“虛線向下規(guī)則”:如果B是M的實(shí)例,同時(shí)A是B的子類,那么,A也是M的實(shí)例。其實(shí)這條規(guī)則很少會(huì)用到,但卻和這篇博客要講的內(nèi)容息息相關(guān)。我來略作分析,從“如果B是M的實(shí)例”這句話得出,B是實(shí)例,“A是B的子類” --> B是一個(gè)(父)類。B是實(shí)例,同時(shí)又是一個(gè)類?怎么回事?看完這篇博客,你會(huì)知道答案的。

python中type和object有什么用

在這里,我來解釋一下為什么叫"虛線向上規(guī)則",通過觀察上圖右邊,我們可以清晰地見到一個(gè)帶箭頭的虛線,從X端出發(fā),射向A端,此時(shí),A端為箭頭端,虛線代表類型實(shí)例關(guān)系,所以A端是類型,即X是A的實(shí)例(換句話說,A是X的類型),通過命令X.__class__我們可查看X的類型。再看,一條帶箭頭的實(shí)線從A端射向B端,B端是箭頭端,實(shí)線代表父子關(guān)系,所以B端是父類,即A是B的子類。這時(shí)候,我們通過將X端射向A端的虛線,向上抬,射向B端(你應(yīng)該可以看到上圖右上方有一條標(biāo)志為implied[這個(gè)單詞意思是隱藏]的向上虛線),就實(shí)現(xiàn)了表述X也是是B的實(shí)例的目的。也名副其實(shí),虛線向上嘛。虛線向下規(guī)則也可以這樣推出來,我就不演示了。

總的來說,面向?qū)ο篌w系里,有兩種關(guān)系,一種是父子關(guān)系,通過父類與子類來描述,另一種是類型實(shí)例關(guān)系,通過類和實(shí)例來描述。而兩條規(guī)則,是將類之間,類與實(shí)例之間的關(guān)系聯(lián)系在一起。

到這里,可以進(jìn)入主題了。

基本概念

對象內(nèi)部:The Object Within

上面我們說了面向?qū)ο螅敲磳ο螅╫bject)是什么呢?對象是python的重要核心之一:它是某個(gè)實(shí)體的抽象描述。對象擁有下面的特征:

身份(Identity):給定兩個(gè)名字,我可以肯定地說,要么它們是指向同一個(gè)對象,要么不是;

值(A value):這意味著對象包含一堆屬性。我們可以通過objectname.attributename的方式操作屬性;

類型(A type):每個(gè)對象都有一個(gè)確切地類型。例如,對象“2”的類型是int;

一個(gè)或多個(gè)“Bases”(One or more bases):不是所有對象都有Bases,但一些特殊的對象會(huì)有,比如:類。Bases類似于面向?qū)ο笳Z言中的“基類”,“超類”。

如果你想知道一個(gè)對象在內(nèi)存中的位置,你可以調(diào)用id(對象)來查看。在這里,我再次強(qiáng)調(diào),在python中,一切都有對象的概念。數(shù)字2是對象,類型int也是對象...

type和Bases(如果它們存在)非常重要,因?yàn)樗鼈兌x了一個(gè)對象和另一個(gè)對象之間的關(guān)系。請記住,type和Bases本身也是對象,稍后會(huì)提到。

你也許會(huì)認(rèn)為,對象有名字,但名字并不是對象的組成部分。對象的名字存在于這個(gè)對象的命名空間(namespace)之外或者是另一個(gè)對象的屬性。也就是說:名字和這個(gè)對象不是存儲(chǔ)在同一個(gè)“地方”

例子:測試一個(gè)整數(shù)對象

python中type和object有什么用

(1):我們在當(dāng)前命名空間給數(shù)字2分配一個(gè)名字。并將2和“two”綁定在起。

(2):這個(gè)對象的類型是。你會(huì)在其它地方見到類似,int這樣的輸出,其實(shí)它們都是一個(gè)意思。

(3):額,的類型是.

(4):輸出“類int”的基類。

(5):列出整型這個(gè)對象所有的屬性。

可能會(huì)覺得有點(diǎn)亂,我稍微總結(jié)一下:數(shù)字2是類型int(一般來講,在python中“類”和“類型”是同一種東西)的一個(gè)實(shí)例。倒過來說,int是數(shù)字2的類型。元組(,)是類型int的超類(或說父類)。一個(gè)類型的超類可能不止一個(gè),所以用元組表示。

現(xiàn)在,我們引出第一條規(guī)則:

一切皆為對象

上面說的數(shù)字2,類型int,int的超類都是對象。除此之外,你定義的函數(shù),方法...都是對象。

一塊干凈的畫板

現(xiàn)在我們來建立python的對象系統(tǒng)。從一塊干凈的畫板開始...,畫板分為三部分,從左到右,分別代表類的類,類,類的實(shí)例。

python中type和object有什么用

我們會(huì)在這個(gè)畫板中開啟我們的學(xué)習(xí)之旅...

關(guān)系(Relationships)

我們談及對象時(shí),用兩種關(guān)系來連接各種對象,使得對象之間產(chǎn)生聯(lián)系:

父子關(guān)系( the subclass-superclass relationship);

類型實(shí)例關(guān)系( the type-instance relationship )。

在文章開頭已經(jīng)詳細(xì)討論過這兩種關(guān)系了。

進(jìn)入對象( Bring In The Objects)

第一個(gè)對象

我們測試兩個(gè)對象:object和type:

例子1:

python中type和object有什么用

(1),(2):python中的兩個(gè)源對象的名字。我們先前說過type()是用來獲對象的類型的。事實(shí)上,它既是一個(gè)對象,也是獲取其它對象的類型的方法。

(3),(4):查看object的類型??吹給bject是type的實(shí)例,我們另外也用.__class__來核實(shí)它和type()的輸出是一樣的。

(5):object沒有超類,因?yàn)樗旧砭褪撬袑ο蟮某悺?/p>

(6),(7):分別輸出type的類型和超類。即,object是type的超類。type的類型是它自己

我們把例子1獲取的信息描述在畫板上:

python中type和object有什么用

object和type是python中的兩個(gè)源對象,當(dāng)我們嘗試介紹它們是就會(huì)陷入“先有雞還是現(xiàn)有蛋”難題,到底先介紹誰?事實(shí)上,它們是互相依賴對方來定義,所以它們不能分開而論。

繼續(xù)我們的python實(shí)驗(yàn):

python中type和object有什么用

(1):發(fā)生了什么?其實(shí)這里利用了虛線向上規(guī)則,type是object的子類,type的實(shí)例自然也是object的實(shí)例。object是type的實(shí)例啊。

(2):這里我參考的英文文檔解釋是:同時(shí)應(yīng)用虛線向上和虛線向下規(guī)則。但我看得一臉懵逼。因?yàn)槲矣X的這里和(1)一樣啊:type是object的子類,type的實(shí)例自然也是object的實(shí)例。type也是type的實(shí)例啊。

如果你認(rèn)為上面的解釋很混亂,不用理會(huì)它。不影響你理解這篇文章的主要目的。

新概念: type objects

type和object都屬于type objects。type objects翻譯過來就是類型對象了。類型對象的特征:

它們用于表示程序中的抽象數(shù)據(jù)類型。例如,我們定義的一個(gè)類User會(huì)代表系統(tǒng)中所有的用戶。int會(huì)代表系統(tǒng)中所有×××數(shù)字。

它們能被繼承。這意味著你可以利用存在的類型對象創(chuàng)造出新的類型對象。已經(jīng)存在的類型對象是新的類型對象的超類。

它們能被實(shí)例化。這意味著你可以利用已經(jīng)存在的類型對象創(chuàng)造出新的實(shí)例對象。前者是后者的type。

類型對象的類型是type

它們有時(shí)會(huì)被成為類型有時(shí)會(huì)被稱為類。

你沒有看錯(cuò)。在新版本的python中類和類型已經(jīng)是同一樣?xùn)|西了。由一個(gè)很明顯的地方就可以看出來。__class__和type()的輸出是一樣的。

在舊版本的python中,類是特指用class語句創(chuàng)造出來的東西。而內(nèi)置類型例如int一般不會(huì)被認(rèn)為是類,而是被認(rèn)為是類型。但在新版本中它們是同一樣?xùn)|西了。我覺得有必要為這個(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.

類型和非類型(或者說類和非類)都是對象,但只有類型能夠被繼承。非類型擁有具體的值,所以被繼承是毫無意義的,而且它也不能被繼承。做簡單的例子,就是類型int和它的實(shí)例2。int是類型,2是非類型。你說說,繼承2有什么意義?

是否還是會(huì)疑惑到底社么是類型?什么是非類型?

這里有一條判斷規(guī)則送給你:

如果一個(gè)對象,它的類型是“”,那么,它是類型,否則不是。

還記得怎么判斷一個(gè)對象的類型嗎?沒錯(cuò)的,__class__和type()隨意你用。

小總結(jié):

的類型是;

的父類為空;

的類型是它自己本身;

是的子類;

在python中只要兩種對象:類型和非類型。非類型也被稱為實(shí)例。這里有英文原句,我不知怎么翻譯了,很容易看懂,但不知如何說: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.

注意我們在畫板中只畫出兩個(gè)對象的直接關(guān)系,隱藏的關(guān)系就不畫了,節(jié)省我們的精力和畫板尺寸。

更多內(nèi)置對象

python這條船上可不止只有兩個(gè)源對象。通過這兩個(gè)源對象可以繁育出一堆對象:

Figure 2.2. 一些內(nèi)置對象

python中type和object有什么用

上圖中的一些內(nèi)置類型,下面通過例子來測試:

python中type和object有什么用

(1):內(nèi)置對象list;

(2):list的類型是;

(3):list的超類是(,);

(4):內(nèi)置對象tuple.tuple的類型和超類分別是:, (,);

(5)list的一個(gè)實(shí)例mylist;

(6)實(shí)例mylist的類型是;

(7)實(shí)例沒有超類。

我們可以創(chuàng)造一個(gè)tuple或dict的實(shí)例,但我們不能創(chuàng)造一個(gè)mylist的實(shí)例。因?yàn)閙ylist不是一個(gè)類型,它僅僅是一個(gè)實(shí)例。

通過繼承產(chǎn)生新對象

內(nèi)置類型是python本身就有的。那么我們?nèi)绾蝿?chuàng)造一個(gè)新的類型呢?

新的類型不能夠憑空產(chǎn)生,它必須依賴已經(jīng)存在的類型,于是,繼承就呼之欲出了。

例子:通過繼承產(chǎn)生新對象

python中type和object有什么用

(1):class語句告訴python解釋器要通過一個(gè)存在的類型創(chuàng)造一個(gè)新的類型;

(2):在python3.x可以省略掉(object)。

(3):多重繼承;

(4):大多數(shù)內(nèi)置類型可以被繼承,但不是所有的都可以。

通過實(shí)例化產(chǎn)生新對象

Example 2.5.

python中type和object有什么用

(1),(2):利用類型名()的方式創(chuàng)造一個(gè)類型的實(shí)例。()中可能帶參數(shù);

(3):這是python利用內(nèi)置類型創(chuàng)造實(shí)例的語法。沒什么好說的。

注意:僅僅通過對進(jìn)行子類化,類型C就自動(dòng)成為的實(shí)例。原因在常見疑問的第二個(gè)問題中。

在以上的操作后,原本空白的畫板可以畫滿了:

python中type和object有什么用

常見疑問

到這里你頭腦中可能會(huì)有很多疑惑,下面列出其中一些問題以及答案,請酌情欣賞。有沒有提到的請留言,我會(huì)努力搜索答案來解答:

Q: Python如何真正創(chuàng)建一個(gè)新對象?

A: 在python中,創(chuàng)造的新對象有兩種:類型和非類型。類型可被繼承和實(shí)例化。非類型本事就是一個(gè)實(shí)例。當(dāng)python創(chuàng)造新對象時(shí),它會(huì)用自己本身的類型作為新對象的類型。一般會(huì)用到兩個(gè)方法__new__()和__init__()。所以。每個(gè)對象都有類型。

Q:實(shí)例化的時(shí)候要指定類型,但是當(dāng)繼承時(shí)python如何知道用哪個(gè)類型?

它查看你繼承的超類,并且使用超類的類型來作為新對象的類型。

在大多數(shù)的情況下,的子類(和的子類的子類等等)的類型都是

python中type和object有什么用

Q:我能夠創(chuàng)造一個(gè)新的類型?

A:能,這就得元類出場了,通過屬性__metaclass__你可以重新創(chuàng)造一個(gè)類型出來。這里我簡單列一個(gè)例子。元類的話下面會(huì)簡單介紹。

python中type和object有什么用

通過繼承type,我們創(chuàng)造出新的類型。

Q:wow!那我可以使用任何的類型作為metaclass的參數(shù)嗎?

A:不能。只有繼承了type的類能夠做為metaclass的參數(shù)。

Q:我應(yīng)該使用metaclass嗎?

不建議使用。高手除外。

準(zhǔn)備結(jié)束

一幅描繪python對象的圖

我們最后得到一幅由不同對象組成的地圖:

python中type和object有什么用

在大多數(shù)情況之下,我們都是學(xué)習(xí)第二列和第三列的內(nèi)容。至于第一列,那是元類的領(lǐng)域了。不是所有人都要深入學(xué)習(xí)。

來解釋一下上圖的東西:

虛線可以從一列穿過另一列,例如從實(shí)例所在列穿到類所在列。(例外);

實(shí)線不可以穿過其他列。再一次地, -> 是例外。

第三列不允許出現(xiàn)實(shí)線。因?yàn)閷?shí)線代表繼承。第三列地實(shí)例無法子類化;

第三列地對象也不允許被實(shí)例化;

第一,二列包含類型,第三列包含非類型;

如果創(chuàng)造一個(gè)繼承的對象,那么它會(huì)被放在第一列,即元類。這里繼續(xù)強(qiáng)調(diào),類和類型是一樣的。也是一樣的。

注意:是所有類型的類型。也是所有對象的超類(除了它自己)。

總結(jié)

這些內(nèi)容是對前面的總結(jié):

在python中有兩種對象:

類型對象:可以被實(shí)例化和繼承;

非類型對象:不可以被實(shí)例和繼承。

和是python中的兩個(gè)源對象。

每個(gè)對象都有類型。用objectname.__class__查看。

每個(gè)類型對象都有超類(object除外),用objectname.__bases__可以查看。

通過繼承產(chǎn)生的新對象都是類型對象。繼承是用class語句來實(shí)現(xiàn)的。

通過實(shí)例化產(chǎn)生的新對象可能是類型對象,也可能是非類型對象。你看下圖,虛線就表示實(shí)例化,第一列和第二列實(shí)例化產(chǎn)生的新對象就是類型對象。第三列實(shí)例化產(chǎn)生的新對象就是非類型對象。實(shí)例化是通過調(diào)用操作符()來實(shí)現(xiàn)的。比如你自定義了一個(gè)類myclass,實(shí)例化就是在myclass后增加()操作符完成的。也就是instance_of_myclass=myclass()。

python中type和object有什么用

一些python的非類型對象可以通過特殊的語法來創(chuàng)造。例如[1, 2, 3]是list的實(shí)例。

在內(nèi)部,python總是使用類型對象來創(chuàng)造新對象。新創(chuàng)造的對象是該類型對象的實(shí)例。(在這里,實(shí)例有兩種意思:一通過繼承產(chǎn)生的子類,二是通過實(shí)例化產(chǎn)生的具體實(shí)例。但平時(shí)我們說的實(shí)例就是只第二種)。python通過class語句中指定的超類的類型來決定新對象的類型。

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有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


新聞名稱:python中type和object有什么用-創(chuàng)新互聯(lián)
URL標(biāo)題:http://weahome.cn/article/dchegd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部