面向對象編程(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
微信掃一掃
支付寶掃一掃