【python】面對(duì)對(duì)象入門(mén)篇
一.引言
類(lèi)把數(shù)據(jù)與功能綁定在一起。創(chuàng)建新類(lèi)就是創(chuàng)建新的對(duì)象?類(lèi)型,從而創(chuàng)建該類(lèi)型的新?實(shí)例?。類(lèi)實(shí)例具有多種保持自身狀態(tài)的屬性。類(lèi)實(shí)例還支持(由類(lèi)定義的)修改自身狀態(tài)的方法。
和其他編程語(yǔ)言相比,Python 只用了很少的新語(yǔ)法和語(yǔ)義就加入了類(lèi)。Python 的類(lèi)是 C++ 和 Modula-3 中類(lèi)機(jī)制的結(jié)合體,而且支持所有面向?qū)ο缶幊蹋∣OP)的標(biāo)準(zhǔn)特性:
類(lèi)繼承機(jī)制支持多個(gè)基類(lèi),
派生類(lèi)可以覆蓋基類(lèi)的任何方法,
類(lèi)的方法可以調(diào)用基類(lèi)中相同名稱(chēng)的方法。
對(duì)象可以包含任意數(shù)量和類(lèi)型的數(shù)據(jù)。和模塊一樣,
類(lèi)也擁有 Python 天然的動(dòng)態(tài)特性:在運(yùn)行時(shí)創(chuàng)建,創(chuàng)建后也可以修改。
二.python面對(duì)對(duì)象術(shù)語(yǔ)
python面向?qū)ο蟮闹匾g(shù)語(yǔ):
多態(tài)(polymorphism):一個(gè)函數(shù)有多種表現(xiàn)形式,調(diào)用一個(gè)方法有多種形式,但是表現(xiàn)出的方法是不一樣的。
繼承(inheritance)子項(xiàng)繼承父項(xiàng)的某些功能,在程序中表現(xiàn)某種聯(lián)系
封裝(encapsulation)把需要重用的函數(shù)或者功能封裝,方便其他程序直接調(diào)用
類(lèi):對(duì)具有相同數(shù)據(jù)或者方法的一組對(duì)象的集合
對(duì)象:對(duì)象是一個(gè)類(lèi)的具體事例
實(shí)例化:是一個(gè)對(duì)象事例話(huà)的實(shí)現(xiàn)
標(biāo)識(shí):每個(gè)對(duì)象的事例都需要一個(gè)可以唯一標(biāo)識(shí)這個(gè)事例的標(biāo)記
實(shí)例屬性:一個(gè)對(duì)象就是一組屬性的集合
實(shí)例方法:所有存取或者更新對(duì)象某個(gè)實(shí)例一條或者多條屬性函數(shù)的集合。
類(lèi)屬性:屬于一個(gè)類(lèi)中所有對(duì)象的屬性,
類(lèi)方法:那些無(wú)須特定的對(duì)性實(shí)例就能夠工作的從屬于類(lèi)的函數(shù)。
python內(nèi)置類(lèi)的屬性
__dict__ : 類(lèi)的屬性(包含一個(gè)字典,由類(lèi)的數(shù)據(jù)屬性組成)
__doc__ :類(lèi)的文檔字符串
__name__: 類(lèi)名
__module__: 類(lèi)定義所在的模塊(類(lèi)的全名是'__main__.className',如果類(lèi)位于一個(gè)導(dǎo)入模塊mymod中,那么className.__module__ 等于 mymod)
__bases__ : 類(lèi)的所有父類(lèi)構(gòu)成元素(包含了一個(gè)由所有父類(lèi)組成的元組)
class Animal: # 定義一個(gè)空類(lèi) pass Animal.__dict__ Animal.__doc__ Animal.__name__ Animal.__module__ Animal.__bases__ # {'__module__': '__main__', '__dict__':
三.初識(shí)類(lèi)
類(lèi)是一種面對(duì)對(duì)象編程:1 一切皆對(duì)象 ,? ? 2 對(duì)象是數(shù)據(jù)和操作的封裝,? ? 3 對(duì)象是獨(dú)立的 但是對(duì)象之間可以相互作用,? ? 4 目前oop是最接近人類(lèi)認(rèn)知的編程方式類(lèi)對(duì)象:?類(lèi)也是對(duì)象,類(lèi)的定義執(zhí)行后會(huì)生成一個(gè)類(lèi)對(duì)象
類(lèi)屬性:對(duì)對(duì)象狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來(lái)描述,類(lèi)定義中的變量和類(lèi)定義的方法都是類(lèi)的屬性
類(lèi)變量:屬性也是標(biāo)識(shí)符,也是變量
類(lèi)方法:對(duì)對(duì)象行為的抽象,用操作名和實(shí)現(xiàn)該操作的方法來(lái)描述
# 類(lèi)定義: class Person: pass print(Person.__doc__,Person.__name__) # None Person t1 = Person() # t1是類(lèi)Person實(shí)例化得到的實(shí)例,自動(dòng)調(diào)用__init__初始化,第一個(gè)參數(shù)是self print(type(t1), t1) #
我們定義一個(gè)有屬性和方法的類(lèi)
class Person: def __init__(self, name, age=18): self.name = name self.age = age def showme(self): # 將類(lèi)方法綁定在當(dāng)前實(shí)例上,自動(dòng)將綁定的實(shí)例注入給第一形參self print('{} is {} years old'.format(self.name, self.age)) # showme是方法method,本質(zhì)上就是普通的函數(shù)對(duì)象function,它一般要求至少有一個(gè)參數(shù)。第一個(gè)形式參數(shù)可以叫self(約定俗成) tom = Person('Tom') print(Person.showme) print(tom.showme) # 描述器
self指代當(dāng)前實(shí)例本身,當(dāng)我們初始化實(shí)例調(diào)用類(lèi)方法時(shí),將類(lèi)方法綁定在當(dāng)前實(shí)例上,自動(dòng)將綁定的實(shí)例注入給第一形參self
不過(guò),要注意,實(shí)例變量是每個(gè)實(shí)例自己的變量,是自己獨(dú)有的,類(lèi)變量是類(lèi)的變量,是類(lèi)的所有實(shí)例共享的屬性和方法
class Person: age = 3 height = 170 def __init__(self, name, age=18): self.name = name self.age = age tom = Person('Tom') jerry = Person('Jerry', 20) Person.age = 30 print(type(Person),Person.__class__,) print(Person.age,tom.age,jerry.age) #
類(lèi)的函數(shù)幾種定義方法,注意類(lèi)中禁止定義普通函數(shù),調(diào)用時(shí)會(huì)報(bào)TypeError
class A: def showme(): print("我是一個(gè)普通函數(shù)") def showme2(self): print("我是一個(gè)一般方法 me={}".format(self), type(self), self.__dict__) @classmethod def showme3(self): print("我是一個(gè)類(lèi)方法 me={}".format(self), type(self), self.__name__) @classmethod def showme4(cls): print("我是一個(gè)類(lèi)方法 me={}".format(cls), type(cls), cls.__name__) @classmethod def showme5(): print("我是一個(gè)靜態(tài)方法") @staticmethod def showme6(): print("我是一個(gè)靜態(tài)方法") A.showme() # 我是一個(gè)普通函數(shù) a=A() # 一般方法調(diào)用的兩種方式 a.showme2() A.showme2(a) # 我是一個(gè)一般方法 me=<__main__.A object at 0x000001222F117E20>
總結(jié)
類(lèi)變量用全大寫(xiě)命名,類(lèi)用駝峰命名法命名
類(lèi)變量屬于共享變量,所有實(shí)例都可以訪(fǎng)問(wèn)
對(duì)象可以動(dòng)態(tài)的給自己加一個(gè)屬性(動(dòng)態(tài)語(yǔ)言的特性)
實(shí)例.__dict__[變量名] 和 實(shí)例.變量名 ?都可以訪(fǎng)問(wèn)實(shí)例屬性(前者不會(huì)訪(fǎng)問(wèn)類(lèi)字典)
實(shí)例變量會(huì)隱藏同名的類(lèi)變量,實(shí)例無(wú)法直接訪(fǎng)問(wèn)
實(shí)例屬性的查找順序:先找自己的 __dict__ ,如果沒(méi)有,通過(guò)屬性 __class__找自己的類(lèi),再去類(lèi)的 __dict__ 查找
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。