iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0

Python中,類(Class)和對象(Object)是面向對象編程(OOP)的核心概念。通過類和對象,我們可以對現實世界中的事物進行建模,封裝其屬性(數據)和行為(方法),從而使代碼更具結構化、可重用性和可擴展性。

壹、類與對象的基本概念

  • 類(Class):類是對象的藍圖或模板,用於定義某種對象的屬性(成員變量)和行為(成員函數)。
  • 對象(Object):對象是由類創建的實例,擁有類中定義的屬性和行為。對象可以看作是類的具體實例化。

貳、定義類

要定義一個類,我們使用class關鍵字。類中可以包含屬性(變量)和方法(函數)。

一、、定義一個名為Person的類,有屬性name和方法greet

class Person:
    # 初始化方法,用於初始化對象屬性
    def __init__(self, name):
        self.name = name

    # 類的方法
    def greet(self):
        print(f"Hello, my name is {self.name}.")

二、__init__方法

__init__方法是類的構造函數,在創建對象時自動調用,用於初始化對象的屬性。它有一個默認參數self,表示對象本身。

def __init__(self, name):
    self.name = name

三、self參數

self是對象本身的引用,用於訪問類的屬性和方法。它必須作為類中所有方法的第一個參數,但在調用方法時不需要傳遞self,Python會自動處理。

參、創建對象(實例化類)

創建一個類的實例,稱為創建對象。我們通過調用類來創建對象,類似於函數調用。

  • 創建Person類的對象,並調用它的方法。
# 創建對象
person1 = Person("Alice")

# 調用對象的方法
person1.greet()  # 輸出: Hello, my name is Alice.

肆、屬性與方法

一、屬性(Attribute)

屬性是類或對象的變量,用於存儲數據。屬性可以在__init__方法中初始化,也可以在類的其他方法中動態添加。

class Car:
    def __init__(self, make, model):
        self.make = make  # 屬性
        self.model = model  # 屬性

car1 = Car("Toyota", "Corolla")
print(car1.make)  # 輸出: Toyota
print(car1.model)  # 輸出: Corolla

二、方法(Method)

方法是定義在類中的函數,用來描述對象的行為。方法的第一個參數必須是self

class Dog:
    def __init__(self, name):
        self.name = name
    
    def bark(self):
        print(f"{self.name} is barking.")

dog1 = Dog("Rex")
dog1.bark()  # 輸出: Rex is barking.

伍、類變量和實例變量

  • 類變量(Class Variable):屬於整個類,所有對象共享。定義在類體中。
  • 實例變量(Instance Variable):屬於某個對象,每個對象有獨立的實例變量。定義在__init__方法中。
class Animal:
    species = "Dog"  # 類變量

    def __init__(self, name):
        self.name = name  # 實例變量

animal1 = Animal("Buddy")
animal2 = Animal("Charlie")

print(animal1.species)  # 輸出: Dog
print(animal2.species)  # 輸出: Dog

Animal.species = "Cat"
print(animal1.species)  # 輸出: Cat
print(animal2.species)  # 輸出: Cat

陸、類方法和靜態方法

一、類方法(Class Method)

類方法使用@classmethod裝飾器標記,第一個參數是cls,表示類本身。類方法可以訪問類變量,但不能訪問實例變量。

class MyClass:
    count = 0
    
    @classmethod
    def increment_count(cls):
        cls.count += 1

MyClass.increment_count()
print(MyClass.count)  # 輸出: 1

二、靜態方法(Static Method)

靜態方法使用@staticmethod裝飾器標記,它不需要傳入selfcls,不能訪問類屬性或實例屬性,常用於封裝一些邏輯功能。

class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y

result = MathOperations.add(5, 3)
print(result)  # 輸出: 8

柒、繼承(Inheritance)

繼承是一個類(子類)繼承另一個類(父類)的屬性和方法的機制,從而實現代碼的重用。

# 父類
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        pass

# 子類,繼承父類
class Dog(Animal):
    def speak(self):
        return f"{self.name} says Woof!"

# 子類,繼承父類
class Cat(Animal):
    def speak(self):
        return f"{self.name} says Meow!"

dog = Dog("Rex")
cat = Cat("Whiskers")
print(dog.speak())  # 輸出: Rex says Woof!
print(cat.speak())  # 輸出: Whiskers says Meow!

捌、多態性(Polymorphism)

多態性允許不同的子類對同一個方法有不同的實現,而不需要改變方法的調用方式。

for animal in [Dog("Rex"), Cat("Whiskers")]:
    print(animal.speak())  # 根據實際對象調用相應的方法
    # 輸出:
    # Rex says Woof!
    # Whiskers says Meow!

玖、封裝(Encapsulation)

封裝是一種將數據和方法隱藏在類內部的技術,僅對外暴露必要的接口。通過 _ 和 __ 可以對屬性和方法進行隱藏。

class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner
        self.__balance = balance  # 私有屬性,外部無法直接訪問

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount

    def withdraw(self, amount):
        if amount <= self.__balance:
            self.__balance -= amount

    def get_balance(self):
        return self.__balance

account = BankAccount("John", 1000)
print(account.get_balance())  # 輸出: 1000
account.deposit(500)
print(account.get_balance())  # 輸出: 1500

上一篇
第14天:異常處理
下一篇
第16天:繼承
系列文
python30天入門學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言