下面從這幾個方面來詳細詳解Python/ target=_blank class=infotextkey>Python面向對象:
- 初識對象
- 成員方法
- 類和對象
- 構造方法
- 其它內置方法
- 封裝
- 繼承
- 類型注解
- 多態
- 綜合案例
學校開學,要求學生填寫自己的基礎信息,一人發一張白紙,讓學生自己填。
改為登記表,打印出來讓學生自行填寫:
程序中數據的組織
在程序中簡單使用變量來記錄學生信息
使用對象組織數據
在程序中是可以做到和生活中那樣,設計表格、生產表格、填寫表格的組織形式的。
1. 在程序中設計表格,我們稱之為:設計類(class)
2. 在程序中打印生產表格,我們稱之為:創建對象
3. 在程序中填寫表格,我們稱之為:對象屬性賦值
二、成員方法類的定義和使用
在上一節中,我們簡單了解到可以使用類去封裝屬性,并基于類創建出一個個的對象來使用。現在我們來看看類的使用語法:
成員變量和成員方法
那么,什么是類的行為(方法)呢?
可以看出,類中:
- 不僅可以定義屬性用來記錄數據
- 也可以定義函數,用來記錄行為
其中:
- 類中定義的屬性(變量),我們稱之為:成員變量
- 類中定義的行為(函數),我們稱之為:成員方法
在類中定義成員方法和定義函數基本一致,但仍有細微區別:
可以看到,在方法定義的參數列表中,有一個:self關鍵字
self關鍵字是成員方法定義的時候,必須填寫的。
- 它用來表示類對象自身的意思
- 當我們使用類對象調用方法的是,self會自動被python傳入
- 在方法內部,想要訪問類的成員變量,必須使用self
注意事項
self關鍵字,盡管在參數列表中,但是傳參的時候可以忽略它。如:
可以看到,在傳入參數的時候,self是透明的,可以不用理會它。
三、類和對象現實世界的事物和類
現實世界的事物也有屬性和行為,類也有屬性和行為。使用程序中的類,可以完美的描述現實世界的事物。
類和對象
基于類創建對象的語法:
類只是一種程序內的“設計圖紙”,需要基于圖紙生產實體(對象),才能正常工作這種套路,稱之為:面向對象編程。
使用類和對象描述現實事物
在現實中,生產事物
在程序中通過類來描述
基于類創建對象
這就是面向對象編程:設計類,基于類創建對象,由對象做具體的工作。
四、構造方法屬性(成員變量)的賦值
構造方法
Python類可以使用:__init__()方法,稱之為構造方法。
可以實現:
- 在創建類對象(構造類)的時候,會自動執行。
- 在創建類對象(構造類)的時候,將傳入參數自動傳遞給__init__方法使用。
構造方法注意事項
- 重要的事情說三遍,構造方法名稱:__init__ __init__ __init__ , 千萬不要忘記init前后都有2個下劃線
- 構造方法也是成員方法,不要忘記在參數列表中提供:self
- 在構造方法內定義成員變量,需要使用self關鍵字
這是因為:變量是定義在構造方法內部,如果要成為成員變量,需要用self來表示。
五、其它內置方法魔術方法
上文學習的__init__ 構造方法,是Python類內置的方法之一。
這些內置的類方法,各自有各自特殊的功能,這些內置方法我們稱之為:魔術方法
__str__ 字符串方法
當類對象需要被轉換為字符串之時,會輸出如上結果(內存地址)
內存地址沒有多大作用,我們可以通過__str__方法,控制類轉換為字符串的行為。
- 方法名:__str__
- 返回值:字符串
- 內容:自行定義
直接對2個對象進行比較是不可以的,但是在類中實現__lt__方法,即可同時完成:小于符號 和 大于符號 2種比較
__le__ 小于等于比較符號方法
魔術方法:__le__可用于:<=、>=兩種比較運算符上。
__eq__,比較運算符實現方法
不實現__eq__方法,對象之間可以比較,但是是比較內存地址,也即是:不同對象==比較一定是False結果。
實現了__eq__方法,就可以按照自己的想法來決定2個對象是否相等了。
六、封裝面向對象的三大特性
面向對象編程,是許多編程語言都支持的一種編程思想。
簡單理解是:基于模板(類)去創建實體(對象),使用對象完成功能開發。
面向對象包含3大主要特性:
- 封裝
- 繼承
- 多態
封裝表示的是,將現實世界事物的:
- 屬性
- 行為
封裝到類中,描述為:
- 成員變量
- 成員方法
從而完成程序對現實世界事物的描述。
對用戶隱藏的屬性和行為
現實世界中的事物,有屬性和行為。
但是不代表這些屬性和行為都是開放給用戶使用的。
蘋果越獄、Android/ target=_blank class=infotextkey>安卓root,也是為了突破權限使用這些對用戶隱藏的屬性和行為。
私有成員
既然現實事物有不公開的屬性和行為,那么作為現實事物在程序中映射的類,也應該支持。
類中提供了私有成員的形式來支持。
- 私有成員變量
- 私有成員方法
定義私有成員的方式非常簡單,只需要:
- 私有成員變量:變量名以__開頭(2個下劃線)
- 私有成員方法:方法名以__開頭(2個下劃線)
即可完成私有成員的設置
使用私有成員
私有成員無法被類對象使用,但是可以被其它的成員使用。
七、繼承繼承的引出
如果你是設計師,你會如何選擇?
- 每一代新款手機,都從零開始出設計圖
- 基于老款的設計圖,修修改改
單繼承
繼承分為:單繼承和多繼承
使用如圖語法,可以完成類的單繼承。
繼承表示:將從父類那里繼承(復制)來成員變量和成員方法(不含私有)
多繼承
Python的類之間也支持多繼承,即一個類,可以繼承多個父類
多繼承注意事項
多個父類中,如果有同名的成員,那么默認以繼承順序(從左到右)為優先級。即:先繼承的保留,后繼承的被覆蓋。
八、類型注解復寫
子類繼承父類的成員屬性和成員方法后,如果對其“不滿意”,那么可以進行復寫。
即:在子類中重新定義同名的屬性或方法即可。
調用父類同名成員
一旦復寫父類成員,那么類對象調用成員的時候,就會調用復寫后的新成員
如果需要使用被復寫的父類的成員,需要特殊的調用方式:
8.1 變量的類型注解
為什么需要類型注解
在PyCharm中編寫代碼,我們經常能夠見到如下提示:
自動提示可用方法,因為PyCharm確定這個對象,是list類型。
同樣,我們換一份代碼:
定義一個函數func,接收一個參數data
你會發現,PyCharm不會在做出任何提示了
又或者當我們調用方法,進行傳參的時候(快捷鍵ctrl + p彈出提示):
類型注解
Python在3.5版本的時候引入了類型注解,以方便靜態類型檢查工具,IDE等第三方工具。
類型注解:在代碼中涉及數據交互的地方,提供數據類型的注解(顯式的說明)。
主要功能:
- 幫助第三方IDE工具(如PyCharm)對代碼進行類型推斷,協助做代碼提示
- 幫助開發者自身對變量進行類型注釋
支持:
- 變量的類型注解
- 函數(方法)形參列表和返回值的類型注解
類型注解的語法
為變量設置類型注解
基礎語法: 變量: 類型
除了使用 變量: 類型, 這種語法做注解外,也可以在注釋中進行類型注解。
語法:
# type: 類型
為變量設置注解,顯示的變量定義,一般無需注解:
如圖,就算不寫注解,也明確的知曉變量的類型
類型注解的限制
類型注解主要功能在于:
- 幫助第三方IDE工具(如PyCharm)對代碼進行類型推斷,協助做代碼提示
- 幫助開發者自身對變量進行類型注釋(備注)
并不會真正的對類型做驗證和判斷。
也就是,類型注解僅僅是提示性的,不是決定性的
如圖代碼,是不會報錯的哦。
8.2 函數(方法)的類型注解
函數(方法)的類型注解 - 形參注解
如圖所示:
- 在編寫函數(方法),使用形參data的時候,工具沒有任何提示
- 在調用函數(方法),傳入參數的時候,工具無法提示參數類型
這些都是因為,我們在定義函數(方法)的時候,沒有給形參進行注解
函數和方法的形參類型注解語法:
函數(方法)的類型注解 - 返回值注解
同時,函數(方法)的返回值也是可以添加類型注解的。
語法如下:
8.3 Union類型
使用Union[類型, ......, 類型]
可以定義聯合類型注解
Union聯合類型注解,在變量注解、函數(方法)形參和返回值注解中,均可使用。
九、多態
多態,指的是:多種狀態,即完成某個行為時,使用不同的對象會得到不同的狀態。如何理解?
同樣的行為(函數),傳入不同的對象,得到不同的狀態。
多態常作用在繼承關系上.
比如
- 函數(方法)形參聲明接收父類對象
- 實際傳入父類的子類對象進行工作
即:
- 以父類做定義聲明
- 以子類做實際工作
- 用以獲得同一行為, 不同狀態
抽象類(接口)
細心的同學可能發現了,父類Animal的speak方法,是空實現
為什么要使用抽象類呢?
提出標準后,不同的廠家各自實現標準的要求。
抽象類就好比定義一個標準,
包含了一些抽象的方法,要求子類必須實現。
十、綜合案例數據分析案例
某公司,有2份數據文件,現需要對其進行分析處理,計算每日的銷售額并以柱狀圖表的形式進行展示。
數據內容
- 1月份數據是普通文本,使用逗號分割數據記錄,從前到后分別是(日期,訂單id,銷售額,銷售省份)
- 2月份數據是JSON數據,同樣包含(日期,訂單id,銷售額,銷售省份)
作為面向對象的程序員,我們全程將使用面向對象的思想來進行任務的開發。