『無為則無心』Python物件導向 — 46、類和物件

繁華似錦Fighting發表於2022-02-21

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

相關文章