CodeGym /Adesua ahorow /Python SELF TW /建立類別和物件

建立類別和物件

Python SELF TW
等級 15 , 課堂 3
開放

3.1 建立類別

在Python中建立類別是面向物件程式設計 (OOP) 的重要部分。類別允許建立新的資料類型,這些類型可以擁有自己的屬性和方法。讓我們來看看在Python中建立類別的基本概念和範例。

基本概念

  • 類別: 建立物件的模板。類別定義了物件擁有的屬性和方法。
  • 物件: 類別的實例。物件擁有在類別中定義的所有屬性和方法。
  • 屬性: 與類別或物件相關的變數。
  • 方法: 與類別或物件相關的函數。

屬性本質上就是物件或類別的內部變數。方法是在類別中定義的函數。這些術語來自OOP,並與函數和變數一樣被廣泛使用。

要宣告(建立)一個新的類別,使用關鍵字class。此操作的一般語法如下:


class ClassName:
    variable1 = value1
    variableN = valueN
          
    def function1(self):
        函數代碼
            
    def functionM(self):
        函數代碼

基本上,可以說類別是個小程式(變數+函數),放在一個命名區域中——ClassName。

在建立類別之後,你可以建立該類別的物件(實例)。這段代碼就相當簡單:


variableX = ClassName()

重要! 在Python中,變數和方法的名稱通常以小寫字母開頭。類別名稱則以大寫字母開頭。另外,類別名稱中不使用下劃線符號。如果類別名稱由多個單字組成,則每個單字的第一個字母皆需大寫。

如果你想訪問類別/物件的變數,通常這段代碼如下:


variableX.variable1 = 10
variableX.functionM()       

但這裡有一些細節,稍後會介紹…

3.2 處理物件

類別和類別的實例(類別的物件)都是物件,因此他們都可以擁有自己的變數和方法。

有兩種類型的變數:

  • 類別屬性/變數/欄位 (class property)
  • 物件屬性/變數/欄位 (object property)

而方法則有三種類型:

  • 類別方法/函數 (class method)
  • 物件方法/函數 (instance method)
  • 靜態方法 (static method)

方法在宣告和調用的方式上有所不同。

物件方法

當宣告物件方法時,需傳入第一個必要參數——self。調用方法時,此參數接收物件的引用(instance)。


class MyClass:

    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
                   

my_object = MyClass()
my_object.instance_method()
        

在上面的範例中,當instance_method()函數開始執行時,參數self接收了物件my_object的引用。

類別方法

宣告類別方法時,也需要傳入第一個必要參數——cls。調用方法時,此參數接收類別(class object)的引用。此外,類別方法需要以classmethod裝飾器標記,如以下範例:


class MyClass:
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
        
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>
                   

my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
        

在上面的範例中,當class_method()函數開始執行時,參數cls接收了類別MyClass的引用。

靜態方法

宣告靜態方法時不需要傳入任何參數,但它也無法訪問類別的內部資料。此外,方法需以staticmethod裝飾器標記,如以下範例:


class MyClass:
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
        
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>
        
    @staticmethod
    def static_method():
        return "這個方法不依賴於實例或類別"
                   
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method() 
        

靜態方法的調用方式與類別方法非常相似,但不會傳入任何物件或類別的引用。

3.3 類別變數

類別變數

若要宣告類別的變數(屬性),只需在類別內的任何地方宣告即可。通常會在開始時宣告,而類別方法之前。範例:


class MyClass:
    attribute = "我是類別屬性"
        
    @classmethod
    def class_method(cls):
        print(cls.attribute)  # 我是類別屬性
                  
my_object = MyClass()
MyClass.class_method()

如果您想讀取或寫入類別變數的值,請使用cls物件。

原則上,也可以透過類別名稱來訪問類別變數:


class MyClass:
    attribute = "我是類別屬性"
        
    @classmethod
    def class_method(cls):
        print(MyClass.attribute)  # 我是類別屬性
                  
my_object = MyClass()

print(MyClass.attribute)  # 我是類別屬性

物件變數/欄位

物件變數(instance)是物件self的欄位。您可以透過self.name來操作它們。這就是為什麼物件self會被傳入每個物件方法。

範例:


class MyClass:
    attribute = "我是類別屬性"
        
    def set_name(self, name):
        self.name = name
        
    def print_name(self):
        print(self.name)    
                 
my_object = MyClass()
my_object.set_name("名為name的物件欄位") 
my_object.print_name()  # "名為name的物件欄位"
        

每當您調用物件方法時,第一個參數(self)接收您調用該方法的物件的引用。不同的物件方法可以透過self物件訪問共享資料。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION