[Python]Class、Object、Instance 的關係

Python 是一個物件導向(Object Oriented Programming, OOP)的程式語言,在物件導向中最重要的就是 Class、Object、Instance 的關係,以下將用 Python 說明舉例這三者的關係。

圖片來源:[Python 基礎教學] 一切皆為物件,到底什麼是物件 Object ?

先用兩段話來說明三者的關係:

A Class is the template/blueprint for building actual instances of Object.

An Object is an instance of a Class. A class is like a blueprint while an instance is a copy of the class with actual values.

針對 Class、Object、Instance 的個別解釋:

Class

  • Classes are blueprint for creating objects.
  • Classes define properties (attributes) and behaviours (methods) that every instance of the class should have.

Object

  • An Object is an instance of a Class, carrying its own set of attributes and methods defined by the Class.

Instance

  • A instance is an individual object of a certain Class.

舉一個例子來解釋 Class、Object、Instance 的關係:我們把有四條腿、有尾巴、會汪汪叫的動物都歸類(class)為「狗」,所以當我們看到有四條腿、有尾巴、會汪汪叫的動物就會知道這些 objects 屬於「狗」這個類別(class)。今天我養了一隻叫做「同學」的狗,「同學」這個 obejct 就會是「狗」這個類別(class)的一個實際的例子(instance)。

我的理解是,instance 是ㄧ個「特定」的 object(我的狗「同學」這個 instance 是特定的 object),而某個 class 的 objects 則是表示所有由該 class 建立出來的 instances;因此,有些時候 object 和 instance 是可以替換的。

不管今天是你的狗小白、他的狗小黑、還是我的狗同學,都是「狗」這個 class 的 object。而所有的狗都是「狗」的類別(class)的實際的例子(instance),他們就一定會有所有「狗」該有的特性(我們這邊舉例正常情況下的狗),像是有腿、有尾巴、會汪汪叫,所以他們都是「狗」這個類別的 object。而當特別指名你的狗「小黑」就是在說「小黑」這個 instance。


範例:狗

將上述的「狗」寫成 python code 來說明 Class、Object、Instance 的觀念

建立一個「狗」Class

class Dog:
    def __init__(self):
        self.legs = 4
        self.has_tail = True

上面的程式碼是 Dogclass__init__ 則是一個新的 instance 被建立(或是說 object 被建立)時這個 __init__ method 會自動執行。(It’s often referred to as a constructor because it’s used to set up or initialize attributes for a new object.)。

通常用來給定這個新的 instance 的狀態,上面程式碼的範例則是給予 legshas_tail 兩個 attribute,並且定義為 4 和 True。

建立一個 Object

在 Python 中,可以使用以下的方式建立一個 Object,或是說 Instance。

同學 = Dog()

上面的 同學 就是一個 Dog Class 的 Object,或是說一個 Instance。

Class 的 method

class Dog:
    def __init__(self):
        self.legs = 4
        self.has_tail = True
    def bark(self):
        print("汪汪!")

bark method 會發出「汪汪」的叫聲。

以下是程式碼實際的結果:

上面的 mydog 是 Dog class 的 instance,也是一個 class 的 object,當 mydog 這個 instance 建立的時候就會有 legshas_tail 這兩個屬性(attributions),並且還有一個定義的 bark method。


Reference