Python學習三天計劃-3
- 2022 年 10 月 23 日
- 筆記
- Python基礎學習
面向對象
一、類的定義
1.類定義

- class是關鍵字,表示要定義類了
- 類的屬性,即定義在類中的變數(成員變數)
- 類的行為,即定義在類中的函數(成員方法)
2.對象
創建類對象的語法:

class Stu:
name = None
age = None
student = Stu()
3.變數、方法
class Stu:
name = None
age = None
# 注意:在類的方法參數中,要加入self參數,相當於java的this關鍵字(表示類對象本身)
def say(self):
print("hello")
self關鍵字
self關鍵字是成員方法定義的時候,必須填寫的。
- 它用來表示類對象自身的意思
- 當我們使用類對象調用方法的是,self會自動被python傳入
- 在方法內部,想要訪問類的成員變數,必須使用self
注意:
傳參時可以忽略
class Stu:
name = None
age = None
# 注意:在類的方法參數中,要加入self參數,相當於java的this關鍵字(表示類對象本身)
def say(self):
print("hello")
student = Stu()
# 調用say方法時,不需要傳入參數
student.say()

二、類的屬性和行為

現實世界的事物也有屬性和行為,類也有屬性和行為。
使用程式中的類,可以完美的描述現實世界的事物
為什麼非要創建對象才能使用呢?
類只是一種程式內的「設計圖紙」,需要基於圖紙生產實體(對象),才能正常工作**
這種套路,稱之為:面向對象編程

三、類的構造方法

程式碼中,為對象的屬性賦值需要依次進行,略顯繁瑣。
使用構造方法可以簡化賦值操作
描述
Python類可以使用:_init_()方法,稱之為構造方法。
可以實現:
- 在創建類對象(構造類)的時候,會自動執行。
- 在創建類對象(構造類)的時候,將傳入參數自動傳遞給___init_()__方法使用。
使用
class Stu:
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
# 注意:在類的方法參數中,要加入self參數,相當於java的this關鍵字(表示類對象本身)
def say(self):
print("hello")
student = Stu("郜宇博",21)
print(student.age)
print(student.name)

注意
不要忘記init前後都有2個下劃線
構造方法也是成員方法,不要忘記在參數列表中提供:self
構造方法內定義成員變數,需要使用self關鍵字
四、魔術方法
內置的類方法,各自有各自特殊的功能,這些內置方法我們稱之為:魔術方法

| 方法 | 功能 |
|---|---|
| init | 構造方法,可用於創建類對象的時候設置初始化行為 |
| str | 用於實現類對象轉字元串的行為 |
| lt | 用於2個類對象進行小於或大於比較 |
| le | 用於2個類對象進行小於等於或大於等於比較 |
| eq | 用於2個類對象進行相等比較 |
1._str_()字元串方法
類似於java的toString()方法
在列印類對象時,將原來的列印記憶體資訊轉換為自定義列印格式
class Stu:
name = None
age = None
# 注意:在類的方法參數中,要加入self參數,相當於java的this關鍵字(表示類對象本身)
def say(self):
print("hello")
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"姓名:{self.name},年齡:{self.age}"
student = Stu("郜宇博",21)
print(student)

2._lt_()字元串方法
在進行比較時,可以直接使用 > < 符號進行比較(指定比較的數據)
class Stu:
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
# Less than的簡稱
def __lt__(self, other):
return self.age < other.age
student_1 = Stu("郜宇博",21)
student_2 = Stu("郜宇博",50)
# 相當於比較年齡的大小
print(student_1 < student_2)

五、封裝
面向對象包含3大主要特性:
- 封裝
- 繼承
- 多態

現實世界中的事物,有屬性和行為。
但是不代表這些屬性和行為都是開放給用戶使用的
既然現實事物有不公開的屬性和行為,那麼作為現實事物在程式中映射的類,也應該支援。
描述
類中提供了私有成員的形式來支援。
- 私有成員變數
- 私有成員方法
在類中定義的私有變數和方法只能類的內部使用
只需要在定義變數、方法名時前面添加兩個下劃線符號__
class Stu:
name = None
age = None
__gender = '男'
stuent = Stu()
print(stuent.gender)

六、繼承

每一款手機都是基於老款的設計圖,修修改改
1. 程式碼
如下程式碼很複雜,需要引入繼承來簡化程式碼

引入繼承

如下為多繼承
pass關鍵字
代表不執行,空實現,可以用來構建空類,空方法,抽象方法
2. 多繼承

注意

多個父類中,如果有同名的成員,那麼默認以繼承順序(從左到右)為優先順序。
即:先繼承的保留,後繼承的被覆蓋

3. 複寫
子類繼承父類的成員屬性和成員方法後,如果對其「不滿意」,那麼可以進行複寫。
即:在子類中重新定義同名的屬性或方法
class Stu:
name = None
age = None
def say(self):
print("我是學生")
class Man(Stu):
gender = '男'
def say(self):
print("我是男學生")
student = Man()
# 相當於調用Man類重寫的say()方法
student.say()

4.調用父類
方式1:使用父類名調用
- 使用成員變數:父類名.成員變數
- 使用成員方法:父類名.成員方法(self)
方式2:使用super()調用父類成員
- 使用成員變數:super().成員變數
- 使用成員方法:super().成員方法(
class Stu:
name = None
age = None
def say(self):
print("我是學生")
class Man(Stu):
gender = '男'
def say(self):
print("我是男學生")
def student_say(self):
# 調用了父類的方法,兩種方法都可以
# Stu.say(self)
super().say()
student = Man()
# 此方法中調用了父類的方法
student.student_say()

七、類型注釋
在PyCharm中編寫程式碼,我們經常能夠見到如下提示:
因為:PyCharm確定這個對象,是list類型
但是自定義一個函數func,接收一個參數data
PyCharm不會在做出任何提示了
此時使用類型注釋就可以幫助編輯器進行程式碼提示或編寫人員的自我提示
注意:
不會真正的對類型做驗證和判斷。
也就是,類型註解僅僅是提示性的,不是決定性的
1.變數的類型注釋
在變數名後加入冒號:和數據類型
from typing import Dict, List
# int類型
var_1: int = 10
# str類型
var_2: str = "adsad"
# list類型
var_3: list = [1, 2, 3]
var_3_1: List[int] = [1, 2, 3]
# dict類型
var_4: dict = {"age": 10, "name": 20}
var_4_1: Dict[str, int] = {"age": 10, "name": 20}
# 類對象
class Student:
pass
s: Student = Student()
或者使用注釋的方法

2.函數
形參的類型注釋
def func(data : list):
pass
表明類型後,就可以對變數進行程式碼提示了

返回值的類型注釋
def func(data : list) -> int:
pass
3. Union類型
當列表、字典中數據類型不一致時,需要使用到該函數
Union[類型1,類型2]
from typing import List, Union
var : List[Union[int, str, bool]] = [1, "sss", True]
八、多態
多態,指的是:多種狀態,即完成某個行為時,使用不同的對象會得到不同的狀態。

抽象類
class AC:
def cold(self):
pass
def hot(self):
pass
使用
class AC:
def cold(self):
pass
def hot(self):
pass
class Midea(AC):
def cold(self):
print("美的cold")
def hot(self):
print("美的hot")
class Gree(AC):
def cold(self):
print("格力cold")
def hot(self):
print("格力hot")
def to_cold(ac : AC):
ac.cold()
gree : Gree = Gree()
midea : Midea = Midea()
to_cold(gree) # 輸出格力cold


