『無為則無心』Python面向對象 — 46、類和對象

1、理解類和對象

(1)類和對象的關係

  • 思考:洗衣機洗衣服描述過程中,洗衣機其實就是一個事物,即對象,洗衣機對象哪來的呢?
    答:洗衣機是由工廠工人製作出來。

  • 思考:工廠工人怎麼製作出的洗衣機?
    答:工人根據設計師設計的功能圖紙製作洗衣機。

  • 歸納:圖紙 → 洗衣機 → 洗衣服。

(2)總結:

  • 在面向對象編程過程中,有兩個重要組成部分:對象
  • 類和對象的關係:用類去創建(實例化)一個對象。

2、類

類是用於描述現實事物的,它將現實中一系列具有相同特徵和行為的事物進行抽象化,模板化描述,事物的特點(屬性)和行為封裝在其中。

類是一個抽象的概念,不是真實存在的事物。

比如是製造洗衣機時要用到的圖紙,圖紙上有洗衣機的長、寬、高、形狀等參數,根據圖紙(類)來生產(創建)洗衣機(對象),也就是說類是用來創建對象的模版。

如下圖所示:

image

換句話說類也是一個對象,類就是一個用來創建對象的對象。類是type類型(<class 'type'>)的對象,定義類實際上就是定義了一個type類型的對象。

實際上所有的事物都由兩部分構成:

  • 特徵(數據)即是屬性
  • 行為(功能)即是方法

屬性和行為統稱為事物中的成員,我們也稱之為成員屬性和成員行為。

  • 成員屬性在程式碼中的體現就是成員變數。
  • 成員行為在程式碼中的體現就是成員函數(方法)。

3、對象

對象是類創建出來的真實存在的事物,是現實生活中存在的具體實例、個體,即生活看到每一個事物,例如,洗衣機。

創建好對象的,通過對象就可以調用具體的屬性和行為。比如真是存在的洗衣機就可以洗衣服了。

如下圖:

image

注意:開發中,先有類,再有對象。

4、Python中的對象

  • Python中對象是記憶體中專門用來存儲數據的一塊區域。
  • 對象中可以存放各種數據(比如:數字、布爾值、程式碼)
  • 對象由三部分組成:
    1. 對象的標識(id):每個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建函數 id() 來得到。
    2. 對象的類型(type):對象的類型決定了該對象可以保存什麼類型的值,可以進行什麼樣的操作,以及遵循什麼樣的規則。可以使用type()函數查看Python對象的類型。type()返回的是對象而不是簡單的字元串。
    3. 對象的值(value):對象表示的數據。
  • 任何對象的idtype,自對象創建完成就都是不可變的。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)為類,或類的一個元組,如(intlistfloat)。

返回值:

  • 回值為布爾型(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
# 總結:子類實例即屬於子類類型,也屬於父類類型,但父類實例不屬於子類類型。