Python類的定義和使用詳情
1.基礎(chǔ)概念
在面向?qū)ο蟮某绦蛟O(shè)計(jì)過程中有兩個(gè)重要概念:類(class)和對(duì)象(object,也被稱為實(shí)例,instance),其中類是某一批對(duì)象的抽象,可以把類理解成某種概念;對(duì)象才是一個(gè)具體存在的實(shí)體。從這個(gè)意義上看,日常所說的人,其實(shí)都是人的對(duì)象,而不是人類。
Python 定義類的簡(jiǎn)單語法如下:
class 類名:
執(zhí)行語句...
零個(gè)到多個(gè)類變量...
零個(gè)到多個(gè)方法...
類名只要是一個(gè)合法的標(biāo)識(shí)符即可,但這僅僅滿足的是 Python 的語法要求:如果從程序的可讀性方面來看,Python 的類名必須是由一個(gè)或多個(gè)有意義的單詞連綴而成的,每個(gè)單詞首字母大寫,其他字母全部小寫,單詞與單詞之間不要使用任何分隔符。
從上面定義來看,Python 的類定義有點(diǎn)像函數(shù)定義,都是以冒號(hào)(:)作為類體的開始,以統(tǒng)一縮進(jìn)的部分作為類體的。區(qū)別只是函數(shù)定義使用 def 關(guān)鍵字,而類定義則使用 class 關(guān)鍵字。
Python 的類定義由類頭(指 class 關(guān)鍵字和類名部分)和統(tǒng)一縮進(jìn)的類體構(gòu)成,在類體中最主要的兩個(gè)成員就是類變量和方法。如果不為類定義任何類變量和方法,那么這個(gè)類就相當(dāng)于一個(gè)空類,如果空類不需要其他可執(zhí)行語句,則可使用 pass 語句作為占位符。
例如,如下類定義是允許的:
class Empty: ? ? pass
通常來說,空類沒有太大的實(shí)際意義。
類中各成員之間的定義順序沒有任何影響,各成員之間可以相互調(diào)用。
Python 類所包含的最重要的兩個(gè)成員就是變量和方法,其中類變量屬于類本身,用于定義該類本身所包含的狀態(tài)數(shù)據(jù):而實(shí)例變量則屬于該類的對(duì)象,用于定義對(duì)象所包含的狀態(tài)數(shù)據(jù):方法則用于定義該類的對(duì)象的行為或功能實(shí)現(xiàn)。
Python 是一門動(dòng)態(tài)語言,因此它的類所包含的類變量可以動(dòng)態(tài)增加或刪除(程序在類體中為新變量賦值就是增加類變量),程序也可在任何地方為已有的類增加變量;程序可通過 del 語句刪除己有類的類變量。
類似的是,Python 對(duì)象的實(shí)例變量也可以動(dòng)態(tài)增加或刪除(只要對(duì)新實(shí)例變量賦值就是增加實(shí)例變量),因此程序可以在任何地方為己有的對(duì)象增加實(shí)例變量;程序可通過 del 語句刪除已有對(duì)象的實(shí)例變量。
在類中定義的方法默認(rèn)是實(shí)例方法,定義實(shí)例方法的方法與定義函數(shù)的方法基本相同,只是實(shí)例方法的第一個(gè)參數(shù)會(huì)被綁定到方法的調(diào)用者(該類的實(shí)例),因此實(shí)例方法至少應(yīng)該定義一個(gè)參數(shù),該參數(shù)通常會(huì)被命名為 self。
注意:實(shí)例方法的第一個(gè)參數(shù)并不一定要叫 self,其實(shí)完全可以叫任意參數(shù)名,只是約定俗成地把該參數(shù)命名為 self,這樣具有最好的可讀性。
在實(shí)例方法中有一個(gè)特別的方法:__init__,這個(gè)方法被稱為構(gòu)造方法。構(gòu)造方法用于構(gòu)造該類的對(duì)象,Python 通過調(diào)用構(gòu)造方法返回該類的對(duì)象(無須使用 new)。
Python 中很多這種以雙下劃線開頭、雙下劃線結(jié)尾的方法,都具有特殊的意義,本教程后面還會(huì)詳細(xì)介紹這些特殊的方法。
構(gòu)造方法是一個(gè)類創(chuàng)建對(duì)象的根本途徑,因此 Python 還提供了一個(gè)功能:如果開發(fā)者沒有為該類定義任何構(gòu)造方法,那么 Python 會(huì)自動(dòng)為該類定義一個(gè)只包含一個(gè) self 參數(shù)的默認(rèn)的構(gòu)造方法。
2.定義一個(gè) Person 類
下面程序?qū)⒍x一個(gè) Person 類:
class Person : ? ? '這是一個(gè)學(xué)習(xí)Python定義的一個(gè)Person類' ? ? # 下面定義了一個(gè)類變量 ? ? hair = 'black' ? ? def __init__(self, name = 'Charlie', age=8): ? ? ? ? # 下面為Person對(duì)象增加2個(gè)實(shí)例變量 ? ? ? ? self.name = name ? ? ? ? self.age = age ? ? # 下面定義了一個(gè)say方法 ? ? def say(self, content): ? ? ? ? print(content)
上面的 Person 類代碼定義了一個(gè)構(gòu)造方法,該構(gòu)造方法只是方法名比較特殊:__init__,該方法的第一個(gè)參數(shù)同樣是 self,被綁定到構(gòu)造方法初始化的對(duì)象。
與函數(shù)類似的是,Python 也允許為類定義說明文檔,該文檔同樣被放在類聲明之后、類體之前,如上面程序中第二行的字符串所示。
在定義類之后,接下來即可使用該類了。
Python 的類大致有如下作用:
- 定義變量;
- 創(chuàng)建對(duì)象;
- 派生子類;
3.類定義
# coding:utf-8 if __name__ == '__main__': ? ? ''' ? ? 定義:class 類名(object): ? ? ? ? ? ?類屬性,方法等...... ? ? 實(shí)例化: 類名(無參|參數(shù)......) ? ? ''' ? ? class A(object): ? ? ? ? pass ? ? a = A() ? ? print(a) ?# <__main__.A object at 0x00D9DD50>
4.類方法定義
# coding:utf-8
if __name__ == '__main__':
? ? '''
? ? 定義:通過def + 方法名(self,參數(shù)1,參數(shù)2......) self是必須的
? ? 調(diào)用:object.方法名(參數(shù)1,參數(shù)2......)
? ? '''
? ? class B(object):
? ? ? ? sex = 'man'
? ? ? ? def talk(self, name):
? ? ? ? ? ? print(name)
? ? b = B()
? ? b.talk('ok') ?# ok5.類的繼承
# coding:utf-8
if __name__ == '__main__':
? ? '''
? ? 在聲明類的時(shí)候指定這個(gè)類繼承哪些類
? ? class 類名(extend1,extend2.......):
? ? ? ?屬性,方法......
? ? extend1,extend2 代表要繼承的類??梢砸淮涡岳^承多個(gè)類
? ? 繼承順序?yàn)閺淖蟮接?,如果繼承的方法或?qū)傩灾貜?fù),以先繼承的為主
? ? class.__mro__ 查看類的繼承鏈
? ? '''
? ? class C(object):
? ? ? ? sex = 'woman'
? ? ? ? def see(self, name):
? ? ? ? ? ? print(f'看{name}')
? ? ? ? def talk(self, name):
? ? ? ? ? ? print(f'說{name}')
? ? class D(B, C):
? ? ? ? ? pass
? ? d = D()
? ? d.talk('yes') ?# yes 不是 說yes ?以先繼承的為主
? ? d.see('書') ?# 看書
? ? print(d.sex) ?# man 不是 woman ?以先繼承的為主
? ? print(D.__mro__) ?# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)6.類的公有,私有
# coding:utf-8
if __name__ == '__main__':
? ? '''
? ? 私有屬性定義: __+變量名
? ? 私有方法定義: __+函數(shù)名(self,參數(shù)1,參數(shù)2......)
? ? 私有外部無法訪問,只能內(nèi)部訪問。但是私有屬性可以在外部通過object._+類名__+變量名 強(qiáng)制訪問
? ? '''
? ? class E(object):
? ? ? ? __name = 'xie'
? ? ? ? sex = 'man'
? ? ? ? def __talk(self, name):
? ? ? ? ? ? print(name)
? ? ? ? def run(self):
? ? ? ? ? ? self.__talk('ok')
? ? ? ? def dp(self):
? ? ? ? ? ? print(self.__name)
? ? e = E()
? ? # print(e.__name) Error 外部無法訪問私有屬性 D
? ? print(e.sex) ?# man
? ? # e.__talk('yes') Error 外部無法訪問私有方法
? ? # object._+類名__+變量名 強(qiáng)制訪問
? ? print(e._E__name) ?# xie
? ? e.run() ?# ok
? ? e.dp() ?# xie7.子類調(diào)用父類的方法
# coding:utf-8
if __name__ == '__main__':
? ? '''
? ? 通過super().方法(參數(shù)1,參數(shù)2......)調(diào)用,該用法要求python版本3以上
? ? 或
? ? supper(子類名,self).方法(參數(shù)1,參數(shù)2......)
? ? '''
? ? class F(object):
? ? ? ? def talk(self, name):
? ? ? ? ? ? print(f'super name is {name}')
? ? class G(F):
? ? ? ? def talk(self, children_name, super_name):
? ? ? ? ? ? self.print_children_name(children_name)
? ? ? ? ? ? super().talk(super_name)
? ? ? ? def talk2(self, children_name, super_name):
? ? ? ? ? ? self.print_children_name(children_name)
? ? ? ? ? ? super(G, self).talk(super_name)
? ? ? ? def print_children_name(self, name):
? ? ? ? ? ? print(f'children name is {name}')
? ? g = G()
? ? g.talk('小明', '大明') ?# children name is 小明 super name is 大明
? ? g.talk2('小明', '大明') ?# children name is 小明 super name is 大明
到此這篇關(guān)于Python類的定義與使用詳情的文章就介紹到這了,更多相關(guān)Python類的定義與使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
conda創(chuàng)建環(huán)境過程出現(xiàn)"Solving?environment:?failed"報(bào)錯(cuò)的詳細(xì)解
很長(zhǎng)一段時(shí)間沒用conda了,然后突然使用conda創(chuàng)建環(huán)境報(bào)錯(cuò),所以下面這篇文章主要給大家介紹了關(guān)于conda創(chuàng)建環(huán)境過程出現(xiàn)"Solving?environment:?failed"報(bào)錯(cuò)的詳細(xì)解決方法,需要的朋友可以參考下2022-11-11
用Python將PDF文件轉(zhuǎn)存為圖片的實(shí)現(xiàn)方法
在Python中,將PDF文件轉(zhuǎn)換為圖片格式使用專門的庫(kù)來處理PDF文檔,并將其每一頁導(dǎo)出為常見的圖像格式,這可以通過PyMuPDF庫(kù)中的fitz模塊或pdf2image庫(kù)實(shí)現(xiàn),本文給大家介紹了用Python將PDF文件轉(zhuǎn)存為圖片的方法,需要的朋友可以參考下2024-04-04
Python實(shí)現(xiàn)類別變量的獨(dú)熱編碼
這篇文章主要為大家詳細(xì)介紹了基于Python下OneHotEncoder與pd.get_dummies兩種方法,實(shí)現(xiàn)機(jī)器學(xué)習(xí)中最優(yōu)的編碼方法——獨(dú)熱編碼的方法,需要的可以參考一下2023-02-02
python Stanza處理NLP任務(wù)使用詳解(多語言處理工具)
這篇文章主要為大家介紹了python Stanza處理NLP任務(wù)使用詳解,多語言處理工具使用實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python調(diào)用C語言動(dòng)態(tài)庫(kù)的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了Python調(diào)用C語言動(dòng)態(tài)庫(kù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-12-12
Python如何讀寫二進(jìn)制數(shù)組數(shù)據(jù)
這篇文章主要介紹了Python如何讀寫二進(jìn)制數(shù)組數(shù)據(jù),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08

