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
# 總結:子類例項即屬於子類型別,也屬於父類型別,但父類例項不屬於子類型別。