您好,登錄后才能下訂單哦!
簡介
到目前為止,我們的編程都是根據(jù)數(shù)據(jù)的函數(shù)和語句塊來設(shè)計(jì)的,面向過程的編程。還有一種我們將數(shù)據(jù)和功能結(jié)合起來使用對(duì)象的形式,使用它里面的數(shù)據(jù)和方法這種方法叫做面向?qū)ο蟮木幊獭?/p>
類和對(duì)象是面向?qū)ο缶幊痰膬蓚€(gè)重要方面。對(duì)于類和對(duì)象的關(guān)系,舉個(gè)例子就像學(xué)生和小明同學(xué)的關(guān)系一樣。學(xué)生(類)是一個(gè)擁有共同屬性的群體,小明同學(xué)(對(duì)象)是其中一個(gè)有自己特性的個(gè)體。
對(duì)于一個(gè)對(duì)象或類的變量被稱為域,函數(shù)被稱為類或?qū)ο蟮姆椒ā?/p>
域有兩種類型--屬于每個(gè)對(duì)象或?qū)儆陬惐旧?,分別成為實(shí)例變量和類變量。
類使用class關(guān)鍵字創(chuàng)建,類的域和方法被列在一個(gè)縮進(jìn)塊中。
self
類的方法與普通的函數(shù)只有一個(gè)特別的區(qū)別——它們必須有一個(gè)額外的第一個(gè)參數(shù)名稱,但是在調(diào)用這個(gè)方法的時(shí)候你不為這個(gè)參數(shù)賦值,Python會(huì)提供這個(gè)值。這個(gè)特別的變量指對(duì)象本身,按照慣例它的名稱是self。
雖然你可以給這個(gè)參數(shù)任何名稱,但是 強(qiáng)烈建議 你使用self這個(gè)名稱——其他名稱都是不贊成你使用的。使用一個(gè)標(biāo)準(zhǔn)的名稱有很多優(yōu)點(diǎn)——你的程序可以迅速識(shí)別它,如果使用self的話,還有些IDE(集成開發(fā)環(huán)境)也可以幫助你。
給C++/Java/C#程序員的注釋
Python中的self等價(jià)于C++中的self指針和Java、C#中的this參考。
你一定很奇怪Python如何給self賦值以及為何你不需要給它賦值。舉一個(gè)例子會(huì)使此變得清晰。假如你有一個(gè)類稱為MyClass和這個(gè)類的一個(gè)實(shí)例MyObject。當(dāng)你調(diào)用這個(gè)對(duì)象的方法MyObject.method(arg1, arg2)的時(shí)候,這會(huì)由Python自動(dòng)轉(zhuǎn)為MyClass.method(MyObject, arg1, arg2)——這就是self的原理了。
這也意味著如果你有一個(gè)不需要參數(shù)的方法,你還是得給這個(gè)方法定義一個(gè)self參數(shù)
(這個(gè)概念好長啊。。。。。。)
類
class 類名():
代碼塊
'''the first class from liu 我們使用class語句后跟類名,創(chuàng)建了一個(gè)新的類。這后面跟著一個(gè)縮進(jìn)的語句塊形成類體。在這個(gè)例子中,我們使用了一個(gè)空白塊,它由pass語句表示。 接下來,我們使用類名后跟一對(duì)圓括號(hào)來創(chuàng)建一個(gè)對(duì)象/實(shí)例。(我們將在下面的章節(jié)中學(xué)習(xí)更多的如何創(chuàng)建實(shí)例的方法)。為了驗(yàn)證,我們簡單地打印了這個(gè)變量的類型。它告訴我們我們已經(jīng)在__main__模塊中有了一個(gè)Person類的實(shí)例。 可以注意到存儲(chǔ)對(duì)象的計(jì)算機(jī)內(nèi)存地址也打印了出來。這個(gè)地址在你的計(jì)算機(jī)上會(huì)是另外一個(gè)值,因?yàn)镻ython可以在任何空位存儲(chǔ)對(duì)象。 ''' class Person: pass # 空塊 p = Person() print (p) print(__doc__)
運(yùn)行結(jié)果
我們使用class語句后跟類名,創(chuàng)建了一個(gè)新的類。這后面跟著一個(gè)縮進(jìn)的語句塊形成類體。在這個(gè)例子中,我們使用了一個(gè)空白塊,它由pass語句表示。
接下來,我們使用類名后跟一對(duì)圓括號(hào)來創(chuàng)建一個(gè)對(duì)象/實(shí)例。為了驗(yàn)證,我們簡單地打印了這個(gè)變量的類型。它告訴我們我們已經(jīng)在__main__模塊中有了一個(gè)Person類的實(shí)例。
可以注意到存儲(chǔ)對(duì)象的計(jì)算機(jī)內(nèi)存地址也打印了出來。這個(gè)地址在你的計(jì)算機(jī)上會(huì)是另外一個(gè)值,因?yàn)镻ython可以在任何空位存儲(chǔ)對(duì)象。
對(duì)象的方法
對(duì)象的方法其實(shí)就是一個(gè)函數(shù),只不過在這個(gè)函數(shù)會(huì)有一個(gè)特別的參數(shù)self。
class Person: def sayHi(self): print('Hello,how are you?') p = Person() p.sayHi()
運(yùn)行結(jié)果
這個(gè)self感覺不到它的作用,但是還是要在參數(shù)中定義這是為什么呢?
去掉self
從報(bào)錯(cuò)中看出系統(tǒng)在調(diào)用這個(gè)類方法的時(shí)候默認(rèn)給它傳了一個(gè)參數(shù),所以我們必須要有這個(gè)self,不為別的,因?yàn)閳?bào)錯(cuò)。。。。。。
__init__方法
init是一個(gè)初始化塊,在對(duì)象被建立的同時(shí)運(yùn)行這個(gè)代碼塊,為你的對(duì)象初始化。需要注意的是名稱的開始和結(jié)尾都要有兩個(gè)下劃線。
'''__init__方法 __init__一個(gè)對(duì)象被建立的時(shí)候,馬上運(yùn)行。這個(gè)方法是對(duì)你的對(duì)象的初始化。 這個(gè)名稱的開始和結(jié)尾都是雙下劃線。''' class Person: def __init__(self,name): self.name = name def sayHi(self): print('Hello,my name is ',self.name) p = Person('happyLiu') p.sayHi()
運(yùn)行結(jié)果
感覺效果不明顯。。。
class Person: def __init__(self,name): print('這是初始化塊') self.name = name def sayHi(self): print('Hello,my name is ',self.name) p = Person('happyLiu') p.sayHi()
這樣就好啦。
類與對(duì)象的變量
類的變量 由一個(gè)類的所有對(duì)象(實(shí)例)共享使用。
對(duì)象的變量 由類的每個(gè)對(duì)象/實(shí)例擁有。
可以理解為類的變量是這個(gè)類下所有對(duì)象公用的,而對(duì)象的變量是這個(gè)對(duì)象私有的。
一個(gè)很長的例子
class Person: population = 0 def __init__(self,name): self.name = name print('Initalizing %s' % self.name) Person.population += 1 def __del__(self): print('%s says bye.' % self.name) Person.population -= 1 if Person.population == 0: print('I am the last one.') else: print('There are still %d people left.' % Person.population) def sayHi(self): print('Hi, my name is %s.' % self.name) def howMany(self): if Person.population == 1: print('I am the only person here.') else: print('We have %d persons here.' % Person.population) happy = Person('happyLiu') happy.sayHi() happy.howMany() bob = Person('bob james') bob.sayHi() bob.howMany() del bob happy.sayHi() happy.howMany()
運(yùn)行結(jié)果
像__init__方法一樣,還有一個(gè)特殊的方法__del__,它在對(duì)象消逝的時(shí)候被調(diào)用。對(duì)象消逝即對(duì)象不再被使用,它所占用的內(nèi)存將返回給系統(tǒng)作它用。
使用不同的對(duì)象的時(shí)候,就會(huì)調(diào)用類的方法,但是傳的參數(shù)是這個(gè)對(duì)象自己的,所以我們面向?qū)ο蟮木幊淌欠浅l`活的。
繼承
class 子類(父類):
代碼塊
面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重用,實(shí)現(xiàn)這種重用的方法之一是通過 繼承 機(jī)制。繼承完全可以理解成類之間的 類型和子類型 關(guān)系。
人是父類,男人是子類,小明是對(duì)象(小明沒有對(duì)象,(¬︿̫̿¬☆))。
一個(gè)子類型在任何需要父類型的場合可以被替換成父類型,即對(duì)象可以被視作是父類的實(shí)例,這種現(xiàn)象被稱為多態(tài)現(xiàn)象。
另外,我們會(huì)發(fā)現(xiàn)在 重用 父類的代碼的時(shí)候,我們無需在不同的類中重復(fù)它。而如果我們使用獨(dú)立的類的話,我們就不得不這么做了。
舉個(gè)栗子
class SchoolMember: '''Represents any school member.''' def __init__(self,name,age): self.name = name self.age = age print('(Initialized SchoolMember: %s)'%self.name) def tell(self): '''Tell my details.''' print('Name:%s Age:%d'%(self.name,self.age)) class Teacher(SchoolMember): '''Represents a teacher.''' def __init__(self,name,age,salary): SchoolMember.__init__(self,name,age) self.salary = salary print('(Initialized Teacher: %s)' % self.name) def tell(self): SchoolMember.tell(self) print('Salary:"%d"' % self.salary) class Student(SchoolMember): '''Represents a student.''' def __init__(self, name, age, marks): SchoolMember.__init__(self,name,age) self.marks = marks print('(Initialized Student: %s)' % self.name) def tell(self): SchoolMember.tell(self) print('Marks: "%d"'%self.marks) t = Teacher('Mr,Liu',25,3000) s = Student('Swaroop', 22, 75) print() members = [t,s] for member in members: member.tell()
運(yùn)行結(jié)果
為了使用繼承,我們把基本類的名稱作為一個(gè)元組跟在定義類時(shí)的類名稱之后。然后,我們注意到基本類的__init__方法專門使用self變量調(diào)用,這樣我們就可以初始化對(duì)象的基本類部分。這一點(diǎn)十分重要——Python不會(huì)自動(dòng)調(diào)用基本類的constructor,你得親自專門調(diào)用它,SchoolMember.__init__(self,name,age)就是它,開始的時(shí)候無限報(bào)錯(cuò)的就是它。
小總結(jié)
我們已經(jīng)研究了類和對(duì)象的多個(gè)內(nèi)容以及與它們相關(guān)的多個(gè)術(shù)語。通過本章,你已經(jīng)了解了面向?qū)ο蟮木幊痰膬?yōu)點(diǎn)和缺陷。Python是一個(gè)高度面向?qū)ο蟮恼Z言,理解這些概念會(huì)在將來有助于你進(jìn)一步深入學(xué)習(xí)Python。
以上所述是小編給大家介紹的Python面向?qū)ο缶幊淘斀庹?,希望?duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。