(1)面向?qū)ο蟮暮锰?/h4>
在日常中,記錄數(shù)據(jù)時(shí)往往使用統(tǒng)一的表格,這樣就不會使得數(shù)據(jù)信息格式混亂,同樣在程序中的數(shù)據(jù)組織中,僅僅通過變量來記錄會顯得混亂不統(tǒng)一。
在程序中是可以做到和生活中那樣,設(shè)計(jì)表格、生產(chǎn)表格、填寫表格的組織形式的。
1. 在程序中設(shè)計(jì)表格,我們稱之為:設(shè)計(jì)類(class)
![]()
2. 在程序中打印生產(chǎn)表格,我們稱之為:創(chuàng)建對象
![]()
3. 在程序中填寫表格,我們稱之為:對象屬性賦值
(2)類的定義和使用
創(chuàng)建類的語法:
?
class 是關(guān)鍵字,表示要定義類了類的屬性,即定義在類中的變量(成員變量)? ? ? ?類的行為,即定義在類中的函數(shù)(成員方法)?
?創(chuàng)建類對象的語法:
?
?(3)成員變量和成員方法
?
可以看出,類中:
其中:
(4)?成員方法的定義語法
在類中定義成員方法和定義函數(shù)基本一致,但仍有細(xì)微區(qū)別:
可以看到,在方法定義的參數(shù)列表中,有一個(gè):self關(guān)鍵字
self關(guān)鍵字是成員方法定義的時(shí)候,必須填寫的。
? 它用來表示類對象自身的意思? 當(dāng)我們使用類對象調(diào)用方法的是, self 會自動被 python 傳入? 在方法內(nèi)部,想要訪問類的成員變量,必須使用 self![]()
self關(guān)鍵字,盡管在參數(shù)列表中,但是傳參的時(shí)候可以忽略它。
如:
?
?可以看到,在傳入?yún)?shù)的時(shí)候,self是透明的,可以不用理會它
(5)?構(gòu)造方法
上述代碼中,為對象的屬性賦值需要依次進(jìn)行,略顯繁瑣。有沒有更加高效的方式,能夠一行代碼就完成呢?可以,需要使用構(gòu)造方法:__init__()
Python類可以使用:__init__()方法,稱之為構(gòu)造方法。
可以實(shí)現(xiàn):
?注意:
? 構(gòu)造方法名稱: ? __ init __ , 千萬不要忘記 init 前后都有 2 個(gè)下劃線? 構(gòu)造方法也是成員方法,不要忘記在參數(shù)列表中提供: self? 在構(gòu)造方法內(nèi)定義成員變量,需要 使用 self 關(guān)鍵字
(6)幾種常用的類內(nèi)置方法(魔術(shù)方法)
上文的__init__ 構(gòu)造方法,是Python類內(nèi)置的方法之一。
這些內(nèi)置的類方法,各自有各自特殊的功能,這些內(nèi)置方法我們稱之為:魔術(shù)方法
魔術(shù)方法很多,這里介紹幾個(gè)常見的
①__str__ 字符串方法
?方法名:__str__?????????返回值:字符串?????????內(nèi)容:自行定義
當(dāng)類對象需要被轉(zhuǎn)換為字符串之時(shí),會輸出如上結(jié)果(內(nèi)存地址)
內(nèi)存地址沒有多大作用,我們可以通過__str__方法,控制類轉(zhuǎn)換為字符串的行為。
②__lt__ 小于符號比較方法
??傳入?yún)?shù):other,另一個(gè)類對象?????????返回值:True 或 False?????????內(nèi)容:自行定義
__lt__方法,即可同時(shí)完成:小于符號 和 大于符號 2種比較
?比較大于符號的魔術(shù)方法是:__gt__,不過,實(shí)現(xiàn)了__lt__,__gt__就沒必要實(shí)現(xiàn)了
③__le__ 小于等于比較符號方法
?傳入?yún)?shù):other,另一個(gè)類對象?????????返回值:True 或 False????????內(nèi)容:自行定義
?__le__可用于:<=、>=兩種比較運(yùn)算符上。
>=符號實(shí)現(xiàn)的魔術(shù)方法是:__ge__,不過,實(shí)現(xiàn)了__le__,__ge__就沒必要實(shí)現(xiàn)了
④__eq__?比較運(yùn)算符實(shí)現(xiàn)方法
?傳入?yún)?shù):other,另一個(gè)類對象?????????返回值:True 或 False?????????內(nèi)容:自行定義
不實(shí)現(xiàn)__eq__方法,對象之間可以比較,但是是比較內(nèi)存地址,也即是:不同對象==比較一定是False結(jié)果。
實(shí)現(xiàn)了__eq__方法,就可以按照自己的想法來決定2個(gè)對象是否相等了
?(7)面向?qū)ο蟮娜筇匦?/h4>
面向?qū)ο缶幊?,是許多編程語言都支持的一種編程思想。
簡單理解是:基于模板(類)去創(chuàng)建實(shí)體(對象),使用對象完成功能開發(fā)。
面向?qū)ο蟀?/span>3大主要特性:
? 封裝? 繼承? 多態(tài)
(8)封裝
封裝表示的是,將現(xiàn)實(shí)世界事物的:屬性和行為,封裝到類中,描述為:成員變量和成員方法,從而完成程序?qū)ΜF(xiàn)實(shí)世界事物的描述。
現(xiàn)實(shí)世界中的事物,有屬性和行為。但是不代表這些屬性和行為都是開放給用戶使用的。
既然現(xiàn)實(shí)事物有不公開的屬性和行為,那么作為現(xiàn)實(shí)事物在程序中映射的類,也應(yīng)該支持。
類中提供了私有成員的形式來支持。
? 私有成員變量? 私有成員方法
定義私有成員的方式非常簡單,只需要:
? 私有成員變量:變量名以 __ 開頭( 2 個(gè)下劃線)? 私有成員方法:方法名以 __ 開頭( 2 個(gè)下劃線)
即可完成私有成員的設(shè)置
私有方法無法直接被類對象使用????????
??????????????
私有變量無法賦值,也無法獲取值
?
私有成員無法被類對象使用,但是可以被其它的成員使用。
?(9)繼承
①單繼承
若不使用繼承,我們想創(chuàng)造一個(gè)新的類時(shí),需要重新定義變量和方法,比較繁瑣,如下
而使用繼承之后可使代碼變得簡潔
使用如下圖語法,可以完成類的單繼承。
繼承表示:將從父類那里繼承(復(fù)制)來成員變量和成員方法(不含私有)
?②多繼承
Python的類之間也支持多繼承,即一個(gè)類,可以繼承多個(gè)父類
?
?
?多繼承注意事項(xiàng)
多個(gè)父類中,如果有同名的成員,那么默認(rèn)以繼承順序(從左到右)為優(yōu)先級。
即:先繼承的保留,后繼承的被覆蓋
?
③pass關(guān)鍵字
pass是占位語句,用來保證函數(shù)(方法)或類定義的完整性,表示無內(nèi)容,空的意思
④復(fù)寫
子類繼承父類的成員屬性和成員方法后,如果對其“不滿意”,那么可以進(jìn)行復(fù)寫。
即:在子類中重新定義同名的屬性或方法即可。
一旦復(fù)寫父類成員,那么類對象調(diào)用成員的時(shí)候,就會調(diào)用復(fù)寫后的新成員
如果需要使用被復(fù)寫的父類的成員,需要特殊的調(diào)用方式:
方式1:
? 調(diào)用父類成員???? 使用成員變量:父類名.成員變量
???? 使用成員方法:父類名.成員方法(self)
方式2:
? 使用 super() 調(diào)用父類成員???? 使用成員變量:super().成員變量
???? 使用成員方法:super().成員方法()
只可以在子類內(nèi)部調(diào)用父類的同名成員,子類的實(shí)體類對象調(diào)用默認(rèn)是調(diào)用子類復(fù)寫的
(10)類型注解
Python在3.5版本的時(shí)候引入了類型注解,以方便靜態(tài)類型檢查工具,IDE等第三方工具。
類型注解:在代碼中涉及數(shù)據(jù)交互的地方,提供數(shù)據(jù)類型的注解(顯式的說明)。
主要功能:
? 幫助第三方 IDE 工具(如 PyCharm )對代碼進(jìn)行類型推斷,協(xié)助做代碼提示? 幫助開發(fā)者自身對變量進(jìn)行類型注釋支持:
? 變量的類型注解? 函數(shù)(方法)形參列表和返回值的類型注解
①為變量設(shè)置類型注解
方法一:
基礎(chǔ)語法:? 變量: 類型
? ? ?
?
?
注意:
? 元組類型設(shè)置類型詳細(xì)注解,需要將每一個(gè)元素都標(biāo)記出來? 字典類型設(shè)置類型詳細(xì)注解,需要 2 個(gè)類型,第一個(gè)是 key 第二個(gè)是 value
?方法二:
除了使用 變量: 類型, 這種語法做注解外,也可以在注釋中進(jìn)行類型注解。
語法:? ?# type: 類型
一般,無法直接看出變量類型之時(shí),會添加變量的類型注解
類型注解的限制
類型注解主要功能在于:
? 幫助第三方 IDE 工具(如 PyCharm )對代碼進(jìn)行類型推斷,協(xié)助做代碼提示? 幫助開發(fā)者自身對變量進(jìn)行類型注釋(備注)并不會真正的對類型做驗(yàn)證和判斷。
也就是,類型注解僅僅是提示性的,不是決定性的
?
如圖代碼,是不會報(bào)錯的。
②?函數(shù)(方法)的類型注解
【1】形參注解
如圖所示:
這些都是因?yàn)椋覀冊诙x函數(shù)(方法)的時(shí)候,沒有給形參進(jìn)行注解
函數(shù)和方法的形參類型注解語法:
【2】返回值注解
同時(shí),函數(shù)(方法)的返回值也是可以添加類型注解的。
語法如下:注意,返回值類型注解的符號使用: ->
?③Union類型
使用Union[類型, ......, 類型],可以定義聯(lián)合類型注解
?Union聯(lián)合類型注解,在變量注解、函數(shù)(方法)形參和返回值注解中,均可使用。
(11)多態(tài)
多態(tài),指的是:多種狀態(tài),即完成某個(gè)行為時(shí),使用不同的對象會得到不同的狀態(tài)。
同樣的行為(函數(shù)),傳入不同的對象,得到不同的狀態(tài)
?抽象類(接口)
包含抽象方法的類,稱之為抽象類。抽象方法是指:沒有具體實(shí)現(xiàn)的方法(pass)稱之為抽象方法
多用于做頂層設(shè)計(jì)(設(shè)計(jì)標(biāo)準(zhǔn)),以便子類做具體實(shí)現(xiàn)。
也是對子類的一種軟性約束,要求子類必須復(fù)寫(實(shí)現(xiàn))父類的一些方法
并配合多態(tài)使用,獲得不同的工作狀態(tài)。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-539692.html文章來源:http://www.zghlxwxcb.cn/news/detail-539692.html
?
到了這里,關(guān)于Python學(xué)習(xí)筆記(二十)————面向?qū)ο蟮奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!