對(duì)象
將對(duì)象的屬性和行為包裝起來(lái)
對(duì)象=屬性+方法
類(lèi)的創(chuàng)建
對(duì)象的實(shí)例化以及方法的調(diào)用
面向?qū)ο蟮奶卣?/b>
封裝(封裝了屬性和方法,成為一個(gè)獨(dú)立性的模塊寒波,相當(dāng)于信息的隱蔽)械念,繼承(子類(lèi)自動(dòng)共享父類(lèi)之間數(shù)據(jù)和方法的機(jī)制)兔跌,多態(tài)(不同對(duì)象對(duì)同一方法響應(yīng)不同的行動(dòng))
類(lèi)的繼承以及子類(lèi)對(duì)象的實(shí)例化和方法屬性的繼承,pass是占位符
self是什么帝嗡?
self相當(dāng)于Java中的this晶通,將相當(dāng)于類(lèi)的自身。默認(rèn)self是類(lèi)中方法的第一個(gè)參數(shù)哟玷。
self在類(lèi)的內(nèi)部狮辽,相當(dāng)于類(lèi)的對(duì)象
Python的魔法方法
--init--(self) ?方法,相當(dāng)于類(lèi)的構(gòu)造方法巢寡,在類(lèi)的實(shí)例化的時(shí)候就會(huì)被自動(dòng)調(diào)用喉脖。
可以在類(lèi)中重寫(xiě)--init--(self)方法,添加參數(shù)和添加方法體抑月。
python的方法參數(shù)如果有默認(rèn)值动看,那么在調(diào)用的時(shí)候參數(shù)也是可選的(類(lèi)似于kotlin)
公有和私有
默認(rèn)的屬性和函數(shù)都是公有的
在Python中定義私有變量只需要在變量名或者函數(shù)名前加上--兩個(gè)下劃線(xiàn),那么這個(gè)函數(shù)或變量就變成私有的爪幻。私有的屬性可以使用方法在內(nèi)部調(diào)用,然后再通過(guò)對(duì)象調(diào)用該方法就可以調(diào)用這個(gè)私有屬性须误。私有屬性加上雙下劃線(xiàn)其實(shí)內(nèi)部就是將屬性名變成了“-類(lèi)名--屬性名”挨稿,那么我們就可以使用對(duì)象調(diào)用這個(gè)變量了。方式:對(duì)象名.-類(lèi)名--屬性名京痢,所以說(shuō)python的私有是偽私有奶甘。
繼承
繼承的方式
如果子類(lèi)中定義與父類(lèi)同名的方法或者屬性,則會(huì)自動(dòng)覆蓋父類(lèi)對(duì)應(yīng)的方法或者屬性祭椰。
在子類(lèi)中重寫(xiě)方法時(shí)臭家,如果還想要父類(lèi)的方法,有兩種方法方淤。
----調(diào)用未綁定的父類(lèi)方法
調(diào)用未綁定的父類(lèi)方法
----使用super函數(shù)
使用super 函數(shù)調(diào)用想要用的方法钉赁,不用傳入self參數(shù)
當(dāng)super要調(diào)用的參數(shù)需要傳參時(shí),那么必須傳參携茂,相當(dāng)于普通調(diào)用
多重繼承
多重繼承的形式
組合
把幾個(gè)沒(méi)有繼承關(guān)系你踩,沒(méi)有直線(xiàn)關(guān)系的類(lèi)放到一起。
將幾個(gè)類(lèi)在一個(gè)類(lèi)的構(gòu)造函數(shù)里面實(shí)例化出來(lái)讳苦。
Mix-in
類(lèi)带膜,類(lèi)對(duì)象和實(shí)例對(duì)象
類(lèi)里面的屬性都是靜態(tài)的鸳谜,和類(lèi)對(duì)象相互綁定膝藕。不會(huì)受實(shí)例對(duì)象的影響。如果屬性的名字和方法相同咐扭,屬性會(huì)把方法覆蓋掉芭挽。
類(lèi)的實(shí)例對(duì)象也可以自己創(chuàng)建屬性滑废。
一些約定俗成的規(guī)定:
1.不要試圖在一個(gè)類(lèi)里定義出所有能想到的特性和方法,應(yīng)該通過(guò)繼承和組合來(lái)進(jìn)行拓展览绿。
2.用不同的詞進(jìn)行命名策严,如屬性名用名詞,方法名用動(dòng)詞饿敲。
盡量使用實(shí)例對(duì)象的屬性妻导,少用類(lèi)對(duì)象的屬性。
什么是綁定怀各?
Python嚴(yán)格要求方法需要有實(shí)例才能被調(diào)用倔韭,這種限制其實(shí)就是Python所謂的綁定概念。
實(shí)例對(duì)象在聲明創(chuàng)建時(shí)已經(jīng)在內(nèi)存中有了自己的空間瓢对,和類(lèi)對(duì)象是分開(kāi)的寿酌,互不干擾。即使類(lèi)對(duì)象被刪除硕蛹,實(shí)例對(duì)象還是存在醇疼。但是類(lèi)對(duì)象被刪除之后,就不能再創(chuàng)建實(shí)例對(duì)象了法焰。只有在程序退出實(shí)例對(duì)象才會(huì)從內(nèi)存中銷(xiāo)毀秧荆。
跟類(lèi)相關(guān)的內(nèi)置函數(shù)(BIF)
issubclass(class,classinfo)
如果第一個(gè)參數(shù)class是第二個(gè)參數(shù)class info的子類(lèi)就返回true。但這種方法是非嚴(yán)格的方法埃仪。
1.一個(gè)類(lèi)也會(huì)被認(rèn)為是自身的子類(lèi)乙濒。2.classinfo可以是類(lèi)對(duì)象的組成的元祖,只要class與其中任何一個(gè)候選類(lèi)的子類(lèi)卵蛉,則返回True颁股,否則False
isinstance(object,classinfo)
檢查object是不是classinfo的實(shí)例對(duì)象
1.如果第一個(gè)參數(shù)不是對(duì)象,則永遠(yuǎn)返回false傻丝。2.如果第二個(gè)參數(shù)不是類(lèi)或者由類(lèi)對(duì)象組成的元組甘有,會(huì)拋出TypeError異常。
hasattr(object,name)
判斷object對(duì)象里面有沒(méi)有name屬性葡缰。name要是屬性的名字梧疲,是字符串類(lèi)型的。
getattr(object,name[,default])
獲取object實(shí)例對(duì)象的name屬性的值运准,如果name屬性不存在幌氮,那么就得到default,如果default不存在胁澳,那么就會(huì)拋出異常该互。
setattr(object,name,value)
給object實(shí)例對(duì)象的name屬性賦值value,如果屬性name不存在韭畸,則新建屬性name并賦值宇智。
delattr(object,name)
刪除object實(shí)例對(duì)象的name屬性蔓搞。如果屬性不存在,則拋出異常随橘。
property(fget=None,fset=None,fdel=None,doc=None)
通過(guò)屬性來(lái)設(shè)置屬性喂分。第一個(gè)參數(shù)是獲取屬性的方法,第二個(gè)是設(shè)置屬性的方法机蔗,第三個(gè)是刪除屬性的方法蒲祈。我們可以根據(jù)這個(gè)函數(shù)操作其他屬性的獲取,設(shè)置萝嘁,刪除梆掸。
property方法的好處就是,當(dāng)我們提供給用戶(hù)的setSize牙言,getSize方法需要修改時(shí)酸钦,就會(huì)很麻煩。如果我們提供給用戶(hù)的是x咱枉,那么我們就可以隨便修改方法卑硫,然后修改property的參數(shù)就可以,提供給用戶(hù)的x沒(méi)有變蚕断。