面向對象編程(Object-Oriented Programming, OOP) 是一種編程範式,它使用基於對象的方式來組織代碼。Python 的面向對象編程可以使用 Class 來實現。Class 是 Python 中面向對象編程的核心,它可以實現面向對象編程中的封裝、繼承和多態等特性。
一、創建 Class
要定義一個 Class,可以使用 class 關鍵字。
class Person: def __init__(self, name, age): self.name = name self.age = age
以上代碼定義了一個名為 Person 的 Class,該 Class 有兩個屬性:name 和 age。__init__ 方法是 Class 的構造函數,當創建 Class 對象時會自動調用該方法,self 參數代表對象本身。可以通過如下代碼創建一個 Person 對象:
person = Person("Jack", 30) print(person.name) # 輸出 Jack print(person.age) # 輸出 30
該代碼會創建一個名為 person 的對象,同時輸出 person 對象的 name 和 age 屬性。
二、繼承與多態
繼承是指新的 Class 可以基於現有 Class 創建。Python 支持單繼承和多重繼承。
在繼承時,新的 Class 被稱為子類(Subclass),已有 Class 被稱為父類(Superclass)。子類會自動繼承父類的屬性和方法,並且可以重寫、添加或刪除這些屬性和方法。
class Student(Person): def __init__(self, name, age, grade): super().__init__(name, age) self.grade = grade def study(self): print(self.name, "is studying in grade", self.grade) student = Student("Tom", 18, 12) print(student.name) # 輸出 Tom print(student.age) # 輸出 18 print(student.grade) # 輸出 12 student.study() # 輸出 Tom is studying in grade 12
以上代碼定義了一個名為 Student 的子類,該子類繼承了 Person 父類的 name 和 age 屬性,並添加了一個 grade 屬性和 study 方法。可以通過如下代碼創建一個 Student 對象:
該代碼會創建一個名為 student 的對象,輸出 student 對象的 name、age 和 grade 屬性,同時調用 student 對象的 study 方法。
多態是指在繼承關係中,子類可以使用父類定義的方法,但是可以自己定義該方法的實現,也可以使用父類已定義的方法實現。這樣,在不同的情況下,子類可以使用自己的方法實現,父類方法的實現也可以被使用。
三、封裝
封裝是指把代碼和數據包裝在一起,以便於隱藏內部實現細節。Python 中,可以使用公開、私有和受保護的訪問修飾符來實現封裝。
公開訪問修飾符用於定義公共屬性和方法,可以通過 Class 的對象來訪問它們。
class Car: def __init__(self, color): self.color = color def start(self): print("The car is starting...") car = Car("red") print(car.color) # 輸出 red car.start() # 輸出 The car is starting...
以上代碼定義了一個名為 Car 的 Class,該 Class 有一個公共屬性 color 和一個公共方法 start。可以通過如下代碼創建一個 Car 對象:
該代碼會創建一個名為 car 的對象,輸出 car 對象的 color 屬性,並調用 car 對象的 start 方法。
私有訪問修飾符用於定義私有屬性和方法,可以在 Class 內部訪問它們,但是無法在 Class 的外部訪問它們。
class BankAccount: def __init__(self, balance): self.__balance = balance def deposit(self, amount): self.__balance += amount def withdraw(self, amount): if amount <= self.__balance: self.__balance -= amount else: print("Not enough balance") account = BankAccount(1000) account.deposit(500) account.withdraw(2000) # 不足 2000 的餘額,將輸出 Not enough balance
以上代碼定義了一個名為 BankAccount 的 Class,該 Class 有一個私有屬性 balance,以及兩個公共方法 deposit 和 withdraw。私有屬性 balance 可以通過雙下劃線加變量名的方式定義。
可以通過如下代碼創建一個 BankAccount 對象,並分別調用它的 deposit 和 withdraw 方法。由於 balance 屬性是私有的,無法在 Class 的外部直接訪問該屬性。
受保護訪問修飾符用於定義受保護的屬性和方法,可以在 Class 及其子類中訪問它們,但是無法在 Class 的外部訪問它們。
class Animal: def __init__(self, name, species): self._name = name self._species = species def _eat(self): print(self._name, "is eating...") class Dog(Animal): def __init__(self, name, breed): super().__init__(name, "Dog") self._breed = breed def bark(self): print(self._name, "is barking...") dog = Dog("Charlie", "Golden Retriever") dog.bark() # 輸出 Charlie is barking... dog._eat() # 輸出 Charlie is eating...
以上代碼定義了一個名為 Animal 的 Class 和一個名為 Dog 的子類。Animal Class 有兩個受保護的屬性 _name 和 _species,以及一個受保護的方法 _eat。Dog Class 繼承了 Animal Class,並添加了一個受保護的屬性 _breed 和一個公共方法 bark。在子類中可以通過 self._name 訪問父類的受保護屬性 _name,輸出 dog 對象的 name 屬性,同時調用 dog 對象的 bark 和 _eat 方法。
原創文章,作者:HFZME,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/317428.html