iT邦幫忙

0

Python 物件導向編程(Object-Oriented Programming, OOP) : Class

  • 分享至 

  • xImage
  •  

在 Python 中,Class(類別) 是一種用來'封裝數據'和'操作數據方法'的結構。
Class 提供了創建自定義數據類型的能力,可以用來模擬實際世界的物件或場景。

Class 的主要概念

  • 類別(Class):定義物件的結構(藍圖/範本),包括它的屬性和行為。
  • 物件(Object):物件是類別的「實例化後的產物」,擁有類中定義的屬性與方法。類別的具體實例,擁有類別定義的屬性和方法。複製Class來建立另一個class的副本
  • 屬性(Attribute):類別或物件的數據成員,類似於變數。
  • 方法(Method):操作物件數據的函數,類似於功能。

「實例化後的產物」指的是當我們使用類(Class)創建出物件(Object)時生成的具體實例。實例化是一個過程,把類這個模板具體化,生成能實際使用的物件。每個物件都是類的實例(Instance)。

簡單解釋:類與物件的關係
類(Class)是一個概念、一個模板,就像建築圖紙。
實例化(Instantiation)就是用這個模板製造出一個具體的東西。
物件(Object)是實例化後的產物,就像按圖紙建造出來的建築。

定義和使用 Class

基本語法

class ClassName:
    def __init__(self, attribute1, attribute2):
        self.attribute1 = attribute1  # 定義屬性
        self.attribute2 = attribute2

    def method(self):
        return f"Attribute1 is {self.attribute1}, Attribute2 is {self.attribute2}"

使用類來建立物件 Class 時會呼叫建構式Constructor並賦於屬性值
__init__就是類的「建構子」(constructor),但不像某些語言的建構子會直接建立物件,而是用來初始化物件。

建構式 (Constructor)

Python 中的建構式 (Constructor)是類的 init 方法,用於初始化物件的屬性。
** 建構式的功能 **

  • 初始化物件屬性:設定物件需要的初始值。
  • 提高代碼可讀性與可用性:自動完成初始化,避免手動重複設定。
  • 物件的基本配置:確保物件在創建後能立即使用。

建構式在 Python 中的特性

  • 特殊方法 init:Python 使用這個方法作為建構式,類似於其他語言中的 constructor。
  • 自動調用:在物件實例化時自動執行。
  • 第一個參數永遠是 self:代表被創建的物件本身。

** 建構式的注意事項 **

  • 不能手動調用 init:建構式由 Python 自動執行,手動調用會造成混亂。
  • 每個類別只能有一個 init

關鍵特性和使用示例

  1. 定義類別
class Person:
    # 初始化方法 (__init__)
    def __init__(self, name, age):
        self.name = name  # 設定物件的屬性 name
        self.age = age    # 設定物件的屬性 age

    # 定義方法
    def greet(self):
        return f"Hello, my name is {self.name} and I am {self.age} years old."
  1. 創建物件(實例化類別)
person1 = Person("Alice", 25)  # 創建 Person 類的實例
person2 = Person("Bob", 30)

# 使用物件屬性
print(person1.name)  # 輸出: Alice

# 呼叫物件方法
print(person2.greet())  # 輸出: Hello, my name is Bob and I am 30 years old.

類屬性(Class Attribute)

在 Python 中,如果某個屬性是所有物件(實例)都需要‘共享’的,那麼可以使用**類屬性(Class Attribute)**來處理。類屬性是屬於類本身的,所有該類的實例共享同一個值,而不是每個實例擁有自己的拷貝。

如何設置類屬性
類屬性是在類中定義的變數,通常在類的定義中直接設置,而不是在 init 方法中。
實例可以訪問類屬性,但類屬性並不屬於個別的實例。

class Dog:
    # 類屬性
    species = "Canis Familiaris"  # 所有狗的共同屬性

    def __init__(self, name, breed):
        # 實例屬性
        self.name = name
        self.breed = breed

# 創建物件
dog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Max", "German Shepherd")

# 訪問類屬性
print(dog1.species)  # 輸出: Canis Familiaris
print(dog2.species)  # 輸出: Canis Familiaris

# 修改類屬性
Dog.species = "Canis Lupus Familiaris"

# 所有實例都會看到改動
print(dog1.species)  # 輸出: Canis Lupus Familiaris
print(dog2.species)  # 輸出: Canis Lupus Familiaris

Class 的高級功能

  1. 繼承(Inheritance)
    子類別繼承父類別的屬性和方法,並可進行擴展。
class Animal:
    def __init__(self, species):
        self.species = species

    def sound(self):
        return "Some generic sound"

class Dog(Animal):
    def __init__(self, name, species="Dog"):
        super().__init__(species)  # 繼承父類別的初始化
        self.name = name

    def sound(self):
        return "Woof!"  # 覆蓋父類別的方法

dog = Dog("Buddy")
print(dog.sound())  # 輸出: Woof!

super() 的作用

super() 是一個內建函數,用於調用**父類(或基本base類)**的方法
關鍵點:

  • 避免硬編碼父類名:如果父類名稱改變,super() 能自動適應,而不需要手動修改代碼。
  • 支持多重繼承:super() 能正確處理多重繼承的情況,遵循方法解析順序(MRO, Method Resolution Order)。
  1. 私有屬性與方法
    使用雙下劃線前綴(__)表示屬性或方法是私有的。
class Example:
    def __init__(self):
        self.__private_attr = "Private"

    def __private_method(self):
        return "This is private"

    def public_method(self):
        return f"Accessing: {self.__private_attr}"

example = Example()
print(example.public_method())  # 可透過公有方法訪問私有屬性

Private 的用途

  • 保護數據:防止外部代碼意外或惡意修改類內的核心數據。
  • 封裝細節:將內部邏輯封裝起來,只暴露必須的接口(公共方法)。
  • 提高靈活性:可以隨時更改私有屬性和方法的內部實現,而不會影響外部代碼。
    何時使用私有屬性或方法?
    當你希望某些屬性或方法只在類內部使用時。
    需要隱藏實現細節,提供簡單、清晰的公共接口。
    需要防止外部代碼直接依賴類的內部實現。

Class 的應用場景

  • 模擬現實世界的物件:如車、動物、學生。
  • 封裝代碼邏輯:便於復用和維護。
  • 數據模型設計:如 Django ORM 的數據表模型。
  • 設計模式的實現:如單例模式、工廠模式等。

多重繼承 (Multiple Inheritance)

多重繼承 是指一個類別可以同時繼承多個父類別的特性和行為。在 Python 中,多重繼承是一種允許類別設計更靈活的方法,但也需要謹慎使用以避免複雜性問題。

class Animal:
    def eat(self):
        print("This animal can eat.")

class Flyable:
    def fly(self):
        print("This animal can fly.")

class Bird(Animal, Flyable):  # 同時繼承 Animal 和 Flyable
    def chirp(self):
        print("Bird is chirping.")

# 使用 Bird 類別
bird = Bird()
bird.eat()  # 來自 Animal 類別
bird.fly()  # 來自 Flyable 類別
bird.chirp()  # 來自 Bird 類別

輸出:
This animal can eat.
This animal can fly.
Bird is chirping.

優點
行為組合:可以將不同父類別的功能組合在一起,形成更強大的子類別。
代碼重用:避免重複撰寫通用功能。
更靈活的設計:允許將不同責任分散到多個類別中,並在子類別中合併。

方法解析順序 (MRO, Method Resolution Order)


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言