從0開始的Python學習014面向?qū)ο缶幊蹋ㄍ扑])
簡介
到目前為止,我們的編程都是根據(jù)數(shù)據(jù)的函數(shù)和語句塊來設(shè)計的,面向過程的編程。還有一種我們將數(shù)據(jù)和功能結(jié)合起來使用對象的形式,使用它里面的數(shù)據(jù)和方法這種方法叫做面向?qū)ο蟮木幊獭?/p>
類和對象是面向?qū)ο缶幊痰膬蓚€重要方面。對于類和對象的關(guān)系,舉個例子就像學生和小明同學的關(guān)系一樣。學生(類)是一個擁有共同屬性的群體,小明同學(對象)是其中一個有自己特性的個體。
對于一個對象或類的變量被稱為域,函數(shù)被稱為類或?qū)ο蟮姆椒ā?/p>
域有兩種類型--屬于每個對象或?qū)儆陬惐旧?,分別成為實例變量和類變量。
類使用class關(guān)鍵字創(chuàng)建,類的域和方法被列在一個縮進塊中。
self
類的方法與普通的函數(shù)只有一個特別的區(qū)別——它們必須有一個額外的第一個參數(shù)名稱,但是在調(diào)用這個方法的時候你不為這個參數(shù)賦值,Python會提供這個值。這個特別的變量指對象本身,按照慣例它的名稱是self。
雖然你可以給這個參數(shù)任何名稱,但是 強烈建議 你使用self這個名稱——其他名稱都是不贊成你使用的。使用一個標準的名稱有很多優(yōu)點——你的程序可以迅速識別它,如果使用self的話,還有些IDE(集成開發(fā)環(huán)境)也可以幫助你。
給C++/Java/C#程序員的注釋
Python中的self等價于C++中的self指針和Java、C#中的this參考。
你一定很奇怪Python如何給self賦值以及為何你不需要給它賦值。舉一個例子會使此變得清晰。假如你有一個類稱為MyClass和這個類的一個實例MyObject。當你調(diào)用這個對象的方法MyObject.method(arg1, arg2)的時候,這會由Python自動轉(zhuǎn)為MyClass.method(MyObject, arg1, arg2)——這就是self的原理了。
這也意味著如果你有一個不需要參數(shù)的方法,你還是得給這個方法定義一個self參數(shù)
(這個概念好長啊。。。。。。)
類
class 類名():
代碼塊
'''the first class from liu 我們使用class語句后跟類名,創(chuàng)建了一個新的類。這后面跟著一個縮進的語句塊形成類體。在這個例子中,我們使用了一個空白塊,它由pass語句表示。 接下來,我們使用類名后跟一對圓括號來創(chuàng)建一個對象/實例。(我們將在下面的章節(jié)中學習更多的如何創(chuàng)建實例的方法)。為了驗證,我們簡單地打印了這個變量的類型。它告訴我們我們已經(jīng)在__main__模塊中有了一個Person類的實例。 可以注意到存儲對象的計算機內(nèi)存地址也打印了出來。這個地址在你的計算機上會是另外一個值,因為Python可以在任何空位存儲對象。 ''' class Person: pass # 空塊 p = Person() print (p) print(__doc__)
運行結(jié)果

我們使用class語句后跟類名,創(chuàng)建了一個新的類。這后面跟著一個縮進的語句塊形成類體。在這個例子中,我們使用了一個空白塊,它由pass語句表示。
接下來,我們使用類名后跟一對圓括號來創(chuàng)建一個對象/實例。為了驗證,我們簡單地打印了這個變量的類型。它告訴我們我們已經(jīng)在__main__模塊中有了一個Person類的實例。
可以注意到存儲對象的計算機內(nèi)存地址也打印了出來。這個地址在你的計算機上會是另外一個值,因為Python可以在任何空位存儲對象。
對象的方法
對象的方法其實就是一個函數(shù),只不過在這個函數(shù)會有一個特別的參數(shù)self。
class Person:
def sayHi(self):
print('Hello,how are you?')
p = Person()
p.sayHi()
運行結(jié)果

這個self感覺不到它的作用,但是還是要在參數(shù)中定義這是為什么呢?
去掉self

從報錯中看出系統(tǒng)在調(diào)用這個類方法的時候默認給它傳了一個參數(shù),所以我們必須要有這個self,不為別的,因為報錯。。。。。。
__init__方法
init是一個初始化塊,在對象被建立的同時運行這個代碼塊,為你的對象初始化。需要注意的是名稱的開始和結(jié)尾都要有兩個下劃線。
'''__init__方法
__init__一個對象被建立的時候,馬上運行。這個方法是對你的對象的初始化。
這個名稱的開始和結(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()
運行結(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()

這樣就好啦。
類與對象的變量
類的變量 由一個類的所有對象(實例)共享使用。
對象的變量 由類的每個對象/實例擁有。
可以理解為類的變量是這個類下所有對象公用的,而對象的變量是這個對象私有的。
一個很長的例子
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()
運行結(jié)果

像__init__方法一樣,還有一個特殊的方法__del__,它在對象消逝的時候被調(diào)用。對象消逝即對象不再被使用,它所占用的內(nèi)存將返回給系統(tǒng)作它用。
使用不同的對象的時候,就會調(diào)用類的方法,但是傳的參數(shù)是這個對象自己的,所以我們面向?qū)ο蟮木幊淌欠浅l`活的。
繼承
class 子類(父類):
代碼塊
面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重用,實現(xiàn)這種重用的方法之一是通過 繼承 機制。繼承完全可以理解成類之間的 類型和子類型 關(guān)系。
人是父類,男人是子類,小明是對象(小明沒有對象,(¬︿̫̿¬☆))。
一個子類型在任何需要父類型的場合可以被替換成父類型,即對象可以被視作是父類的實例,這種現(xiàn)象被稱為多態(tài)現(xiàn)象。
另外,我們會發(fā)現(xiàn)在 重用 父類的代碼的時候,我們無需在不同的類中重復它。而如果我們使用獨立的類的話,我們就不得不這么做了。
舉個栗子
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()
運行結(jié)果

為了使用繼承,我們把基本類的名稱作為一個元組跟在定義類時的類名稱之后。然后,我們注意到基本類的__init__方法專門使用self變量調(diào)用,這樣我們就可以初始化對象的基本類部分。這一點十分重要——Python不會自動調(diào)用基本類的constructor,你得親自專門調(diào)用它,SchoolMember.__init__(self,name,age)就是它,開始的時候無限報錯的就是它。
小總結(jié)
我們已經(jīng)研究了類和對象的多個內(nèi)容以及與它們相關(guān)的多個術(shù)語。通過本章,你已經(jīng)了解了面向?qū)ο蟮木幊痰膬?yōu)點和缺陷。Python是一個高度面向?qū)ο蟮恼Z言,理解這些概念會在將來有助于你進一步深入學習Python。
以上所述是小編給大家介紹的Python面向?qū)ο缶幊淘斀庹?,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Python簡直是萬能的,這5大主要用途你一定要知道?。ㄍ扑])
- Python3實現(xiàn)計算兩個數(shù)組的交集算法示例
- Python3獲取拉勾網(wǎng)招聘信息的方法實例
- Python3實現(xiàn)的旋轉(zhuǎn)矩陣圖像算法示例
- python3對拉勾數(shù)據(jù)進行可視化分析的方法詳解
- python2.7使用plotly繪制本地散點圖和折線圖
- Python時間序列處理之ARIMA模型的使用講解
- Python代碼實現(xiàn)刪除一個list里面重復元素的方法
- Python參數(shù)解析模塊sys、getopt、argparse使用與對比分析
- Python3安裝Pillow與PIL的方法
相關(guān)文章
用python生成mysql數(shù)據(jù)庫結(jié)構(gòu)文檔
大家好,本篇文章主要講的是用python生成mysql數(shù)據(jù)庫結(jié)構(gòu)文檔,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
python 3.0 模擬用戶登錄功能并實現(xiàn)三次錯誤鎖定
Python的3.0版本,常被稱為Python 3000,或簡稱Py3k。這篇文章主要介紹了python 3.0 模擬用戶登錄功能并實現(xiàn)三次錯誤鎖定,需要的朋友可以參考下2017-11-11
關(guān)于爬蟲中scrapy.Request的更多參數(shù)用法
這篇文章主要介紹了關(guān)于爬蟲中scrapy.Request的更多參數(shù)用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

