『無為則無心』Python面向對象 — 46、類和對象
- 2022 年 2 月 21 日
- 筆記
- 高級測試必會技能 - Python基礎
1、理解類和對象
(1)類和對象的關係
-
思考:洗衣機洗衣服描述過程中,洗衣機其實就是一個事物,即對象,洗衣機對象哪來的呢?
答:洗衣機是由工廠工人製作出來。 -
思考:工廠工人怎麼製作出的洗衣機?
答:工人根據設計師設計的功能圖紙製作洗衣機。 -
歸納:圖紙 → 洗衣機 → 洗衣服。
(2)總結:
- 在面向對象編程過程中,有兩個重要組成部分:類 和 對象。
- 類和對象的關係:用類去創建(實例化)一個對象。
2、類
類是用於描述現實事物的,它將現實中一系列具有相同特徵和行為的事物進行抽象化,模板化描述,事物的特點(屬性)和行為封裝在其中。
類是一個抽象的概念,不是真實存在的事物。
比如是製造洗衣機時要用到的圖紙,圖紙上有洗衣機的長、寬、高、形狀等參數,根據圖紙(類)來生產(創建)洗衣機(對象),也就是說類是用來創建對象的模版。
如下圖所示:
換句話說類也是一個對象,類就是一個用來創建對象的對象。類是type
類型(<class 'type'>
)的對象,定義類實際上就是定義了一個type
類型的對象。
實際上所有的事物都由兩部分構成:
- 特徵(數據)即是屬性
- 行為(功能)即是方法
屬性和行為統稱為事物中的成員,我們也稱之為成員屬性和成員行為。
- 成員屬性在程式碼中的體現就是成員變數。
- 成員行為在程式碼中的體現就是成員函數(方法)。
3、對象
對象是類創建出來的真實存在的事物,是現實生活中存在的具體實例、個體,即生活看到每一個事物,例如,洗衣機。
創建好對象的,通過對象就可以調用具體的屬性和行為。比如真是存在的洗衣機就可以洗衣服了。
如下圖:
注意:開發中,先有類,再有對象。
4、Python中的對象
- Python中對象是記憶體中專門用來存儲數據的一塊區域。
- 對象中可以存放各種數據(比如:數字、布爾值、程式碼)
- 對象由三部分組成:
- 對象的標識(
id
):每個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建函數 id() 來得到。 - 對象的類型(
type
):對象的類型決定了該對象可以保存什麼類型的值,可以進行什麼樣的操作,以及遵循什麼樣的規則。可以使用type()
函數查看Python對象的類型。type()
返回的是對象而不是簡單的字元串。 - 對象的值(
value
):對象表示的數據。
- 對象的標識(
- 任何對象的
id
和type
,自對象創建完成就都是不可變的。value
可變就是可變數據類型,value
不可變的數據類型叫不可變數據類型
5、類和對象的定義
(1)定義類
Python2中類分為:經典類 和 新式類。
新式類語法:
class 類名():
程式碼
......
注意:類名要滿足標識符命名規則,同時遵循大駝峰命名習慣(可以查看【變數】文章中關於命名的內容)。
新式類體驗:
# 定義一個洗衣機類
class Washer():
# 功能洗衣服
def wash(self):
print('我會洗衣服')
拓展:經典類
不由任意內置類型派生出的類,稱之為經典類(Python2中,知道就型)
# 新式類沒有寫類名後的(),就是經典類
class 類名:
程式碼
......
提示:Python 3.x中默認都是新式類。
(2)創建對象
對象也叫做實例。
語法:
對象名 = 類名()
體驗:
# 通過上邊創建的Washer類來創建洗衣機實例對象
# haier1就是一個Washer類型的實例對象
haier1 = Washer()
# 列印haier1對象,
# __main__表示主模組的標識符, 就是代表當前文件的標識符。
# <__main__.Washer object at 0x0000018B7B224240>
print(haier1)
# haier對象調用實例方法(洗衣服功能)
haier1.wash()
注意:創建對象的過程也叫實例化對象。
(3)練習
# 嘗試定義一個表示人的類
class Person():
# 在類的程式碼塊中,我們可以定義變數和函數
# 在類中我們所定義的變數,將會成為所有的實例的公共屬性
# 公共屬性,所有實例都可以訪問
name = 'Python'
# 在類中也可以定義函數,類中的定義的函數,我們稱為方法
# 這些方法可以通過該類創建的所有實例來訪問
def say_hello(self):
# say_hello()這個方法,可以顯示如下格式的數據:
# 你好!我是 xxx
# 在方法中不能直接訪問類中的屬性
print(f'你好!我是{name}')
# 創建Person的實例
p1 = Person()
p2 = Person()
# 獲取對象屬性,對象.屬性名
result = p1.name
print(result) # Python
# 調用對象方法,對象.方法名()
p2.say_hello() # 你好!我是Python
6、拓展:isinstance()
函數
isinstance()
函數來判斷一個對象是否是一個已知的類的實例。
isinstance()
函數的語法:
isinstance(object, classinfo)
參數說明:
- 其第一個參數(
object
)為對象.- 第二個參數(
type
)為類,或類的一個元組,如(int
,list
,float
)。返回值:
- 回值為布爾型(True or flase)。
- 對象的類型與參數二的類型相同則返回True。
- 若參數二為一個元組,則若對象類型與元組中類型名之一相同即返回True。
示例:
# 1.數據類型
name = "孫悟空"
age = 18
print(isinstance(age, int)) # True
print(isinstance(age, float)) # False
print(isinstance(name, str)) # True
print(isinstance(name, list)) # False
print(isinstance(age, (int, list, float))) # True
print(isinstance(name, (int, list, float))) # False
# 2.對象
# 小花貓
class Cat():
pass
# 小奶狗
class Dog():
pass
# 蟒蛇
class Python():
pass
# 創建對象
cat = Cat()
dog = Dog()
python = Python()
print(isinstance(cat, Cat)) # True
print(isinstance(cat, (Cat, Dog))) # True
print(isinstance(cat, (Python, Dog))) # False
# 3.繼承
# 定義一個父類
class Parent():
pass
# 定義一個子類
class Child(Parent):
pass
# 創建父類和子類對象
p = Parent()
c = Child()
print(isinstance(c, Child)) # True
print(isinstance(p, Parent)) # True
print(isinstance(c, Parent)) # True
print(isinstance(p, Child)) # False
# 總結:子類實例即屬於子類類型,也屬於父類類型,但父類實例不屬於子類類型。