Python進(jìn)階學(xué)習(xí)之帶你探尋Python類的鼻祖_第1頁(yè)
Python進(jìn)階學(xué)習(xí)之帶你探尋Python類的鼻祖_第2頁(yè)
Python進(jìn)階學(xué)習(xí)之帶你探尋Python類的鼻祖_第3頁(yè)
Python進(jìn)階學(xué)習(xí)之帶你探尋Python類的鼻祖_第4頁(yè)
Python進(jìn)階學(xué)習(xí)之帶你探尋Python類的鼻祖_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Python進(jìn)階學(xué)習(xí)之帶你探尋Python類的鼻祖目錄一、類也是對(duì)象二、動(dòng)態(tài)地創(chuàng)建類三、使用type創(chuàng)建類四、使用type創(chuàng)建帶有屬性的類五、使用type創(chuàng)建帶有方法的類六、到底什么是元類(終于到主題了)七、metaclass屬性八、自定義元類總結(jié)Python是一門面向?qū)ο蟮恼Z(yǔ)言,所以Python中數(shù)字、字符串、列表、集合、字典、函數(shù)、類等都是對(duì)象。

利用type()來(lái)查看Python中的各對(duì)象類型

In[11]:#數(shù)字

In[12]:type(10)

Out[12]:int

In[13]:type(3.1415926)

Out[13]:float

In[14]:#字符串

In[15]:type('a')

Out[15]:str

In[16]:type("abc")

Out[16]:str

In[17]:#列表

In[18]:type(list)

Out[18]:type

In[19]:type([])

Out[19]:list

In[20]:#集合

In[21]:type(set)

Out[21]:type

In[22]:my_set={1,2,3}

In[23]:type(my_set)

Out[23]:set

In[24]:#字典

In[25]:type(dict)

Out[25]:type

In[26]:my_dict={'name':'hui'}

In[27]:type(my_dict)

Out[27]:dict

In[28]:#函數(shù)

In[29]:deffunc():

...:pass

...:

In[30]:type(func)

Out[30]:function

In[31]:#類

In[32]:classFoo(object):

...:pass

...:

In[33]:type(Foo)

Out[33]:type

In[34]:f=Foo()

In[35]:type(f)

Out[35]:__main__.Foo

In[36]:#type

In[37]:type(type)

Out[37]:type

可以看出

數(shù)字1是int類型的對(duì)象

字符串a(chǎn)bc是str類型的對(duì)象

列表、集合、字典是type類型的對(duì)象,其創(chuàng)建出來(lái)的對(duì)象才分別屬于list、set、dict類型

函數(shù)func是function類型的對(duì)象

自定義類Foo創(chuàng)建出來(lái)的對(duì)象f是Foo類型,其類本身Foo則是type類型的對(duì)象。

連type本身都是type類型的對(duì)象

一、類也是對(duì)象

類就是擁有相等功能和相同的屬性的對(duì)象的集合

在大多數(shù)編程語(yǔ)言中,類就是一組用來(lái)描述如何生成一個(gè)對(duì)象的代碼段。在Python中這一點(diǎn)仍然成立:

In[1]:classObjectCreator(object):

...:pass

...:

In[2]:my_object=ObjectCreator()

In[3]:print(my_object)

__main__.ObjectCreatorobjectat0x0000021257B5A248

但是,Python中的類還遠(yuǎn)不止如此。類同樣也是一種對(duì)象。是的,沒(méi)錯(cuò),就是對(duì)象。只要你使用關(guān)鍵字class,Python解釋器在執(zhí)行的時(shí)候就會(huì)創(chuàng)建一個(gè)對(duì)象。

下面的代碼段:

classObjectCreator(object):

…pass

將在內(nèi)存中創(chuàng)建一個(gè)對(duì)象,名字就是ObjectCreator。這個(gè)對(duì)象(類對(duì)象ObjectCreator)擁有創(chuàng)建對(duì)象(實(shí)例對(duì)象)的能力。但是,它的本質(zhì)仍然是一個(gè)對(duì)象,于是乎你可以對(duì)它做如下的操作:

1.你可以將它賦值給一個(gè)變量

2.你可以拷貝它

3.你可以為它增加屬性

4.你可以將它作為函數(shù)參數(shù)進(jìn)行傳遞

如下示例:

In[39]:classObjectCreator(object):

...:pass

...:

In[40]:print(ObjectCreator)

class'__main__.ObjectCreator'

In[41]:#當(dāng)作參數(shù)傳遞

In[41]:defout(obj):

...:print(obj)

...:

In[42]:out(ObjectCreator)

class'__main__.ObjectCreator'

In[43]:#hasattr判斷一個(gè)類是否有某種屬性

In[44]:hasattr(ObjectCreator,'name')

Out[44]:False

In[45]:#新增類屬性

In[46]:ObjectC='hui'

In[47]:hasattr(ObjectCreator,'name')

Out[47]:True

In[48]:ObjectC

Out[48]:'hui'

In[49]:#將類賦值給變量

In[50]:obj=ObjectCreator

In[51]:obj()

Out[51]:__main__.ObjectCreatorat0x212596a7248

In[52]:

二、動(dòng)態(tài)地創(chuàng)建類

因?yàn)轭愐彩菍?duì)象,你可以在運(yùn)行時(shí)動(dòng)態(tài)的創(chuàng)建它們,就像其他任何對(duì)象一樣。首先,你可以在函數(shù)中創(chuàng)建類,使用class關(guān)鍵字即可。

defcls_factory(cls_name):

創(chuàng)建類工廠

:param:cls_name創(chuàng)建類的名稱

ifcls_name=='Foo':

classFoo():

pass

returnFoo#返回的是類,不是類的實(shí)例

elifcls_name=='Bar':

classBar():

pass

returnBar

IPython測(cè)驗(yàn)

MyClass=cls_factory('Foo')

In[60]:MyClass

Out[60]:__main__.cls_factory.locals.Foo#函數(shù)返回的是類,不是類的實(shí)例

In[61]:MyClass()

Out[61]:__main__.cls_factory.locals.Fooat0x21258b1a9c8

但這還不夠動(dòng)態(tài),因?yàn)槟闳匀恍枰约壕帉懻麄€(gè)類的代碼。由于類也是對(duì)象,所以它們必須是通過(guò)什么東西來(lái)生成的才對(duì)。

當(dāng)你使用class關(guān)鍵字時(shí),Python解釋器自動(dòng)創(chuàng)建這個(gè)對(duì)象。但就和Python中的大多數(shù)事情一樣,Python仍然提供給你手動(dòng)處理的方法。

三、使用type創(chuàng)建類

type還有一種完全不同的功能,動(dòng)態(tài)的創(chuàng)建類。

type可以接受一個(gè)類的描述作為參數(shù),然后返回一個(gè)類。(要知道,根據(jù)傳入?yún)?shù)的不同,同一個(gè)函數(shù)擁有兩種完全不同的用法是一件很傻的事情,但這在Python中是為了保持向后兼容性)

type可以像這樣工作:

type(類名,由父類名稱組成的元組(針對(duì)繼承的情況,可以為空),包含屬性的字典(名稱和值))

比如下面的代碼:

In[63]:classTest:

...:pass

...:

In[64]:Test()

Out[64]:__main__.Testat0x21258b34048

In[65]:

可以手動(dòng)像這樣創(chuàng)建:

In[69]:#使用type定義類

In[69]:Test2=type('Test2',(),{})

In[70]:Test2()

Out[70]:__main__.Test2at0x21259665808

我們使用Test2作為類名,并且也可以把它當(dāng)做一個(gè)變量來(lái)作為類的引用。類和變量是不同的,這里沒(méi)有任何理由把事情弄的復(fù)雜。即type函數(shù)中第1個(gè)實(shí)參,也可以叫做其他的名字,這個(gè)名字表示類的名字

In[71]:UserCls=type('User',(),{})

In[72]:print(UserCls)

class'__main__.User'

In[73]:

使用help來(lái)測(cè)試這2個(gè)類

In[74]:#用help查看Test類

In[75]:help(Test)

HelponclassTestinmodule__main__:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論