




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年智能化住宅小區(qū)綠化養(yǎng)護(hù)及清潔一體化外包合同
- 2025年跨境電子商務(wù)產(chǎn)品進(jìn)出口履約監(jiān)控管理合同
- 0升級(jí)顧問(wèn)協(xié)議-數(shù)字化智能化改造方案合同
- 2025年創(chuàng)新型企業(yè)員工職業(yè)成長(zhǎng)路徑勞動(dòng)合同
- 2025年度綠色建筑能源管理系統(tǒng)升級(jí)改造合同
- 2025年度綠色出行獎(jiǎng)勵(lì)機(jī)制實(shí)施合同
- 2025年城市綠化工程項(xiàng)目服務(wù)采購(gòu)合同編制要點(diǎn)解析
- 2025-2030年中國(guó)PP蜂窩板市場(chǎng)調(diào)研分析及投資前景研究預(yù)測(cè)報(bào)告
- 2025年新型能源汽車融資租賃服務(wù)合同
- 2025年度財(cái)務(wù)顧問(wèn)服務(wù)合同:助力企業(yè)財(cái)務(wù)戰(zhàn)略決策
- TGDMDMA 0026-2023 牙科種植用導(dǎo)板
- 《中醫(yī)辟谷養(yǎng)生技術(shù)》讀書筆記思維導(dǎo)圖
- 醫(yī)院發(fā)生火災(zāi)的應(yīng)急預(yù)案及處理流程
- GB/T 9121-2010平焊環(huán)板式松套鋼制管法蘭
- GB/T 709-2006熱軋鋼板和鋼帶的尺寸、外形、重量及允許偏差
- GB/T 31141-2014家用和類似用途雙穩(wěn)態(tài)電磁閥的通用檢測(cè)方法
- GB/T 17204-2021飲料酒術(shù)語(yǔ)和分類
- GB/T 10789-2015飲料通則
- 疫苗冰箱溫度記錄表
- 患者跌倒墜床
- SJG 49-2019 深圳市公安交警基層業(yè)務(wù)用房及配套設(shè)施建設(shè)標(biāo)準(zhǔn)-高清現(xiàn)行
評(píng)論
0/150
提交評(píng)論