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
物件訪問共享資料。
GO TO FULL VERSION