????????面向對象編程(OOP)是一種以對象為核心的編程范式。Python全面支持OOP,主要包含以下核心概念:
一、類與對象
1.類(Class)
類是創建對象的模板或藍圖,它定義了對象的屬性和方法。
class Dog:# 類屬性(所有實例共享)species = "Canis familiaris"# 初始化方法(構造對象)def __init__(self, name, age):# 實例屬性(每個對象獨立)self.name = nameself.age = age# 實例方法def bark(self):return f"{self.name} says Woof!"
2.對象(Object)
對象是類的實例,具有類定義的屬性和方法。
my_dog = Dog("Buddy", 3)
print(my_dog.bark()) ?# 輸出: Buddy says Woof!
二、三大核心特性
1.封裝(Encapsulation)
????????封裝是將數據(屬性)和操作數據的方法(行為)綁定在一起,并隱藏內部實現細節,只對外提供必要的接口。Python通過私有屬性和私有方法實現封裝。
class BankAccount:def __init__(self, balance=0):self.__balance = balance # 私有屬性def deposit(self, amount):if amount > 0:self.__balance += amountreturn Truereturn Falsedef withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountreturn Truereturn Falsedef get_balance(self): # 提供獲取余額的方法return self.__balanceaccount = BankAccount(100)
account.deposit(50)
print(account.get_balance()) # 輸出: 150
# print(account.__balance) # 報錯,無法直接訪問私有屬性
2.繼承(Inheritance)
繼承允許一個類(子類)繼承另一個類(父類)的屬性和方法,實現代碼的重用和擴展。
class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Subclass must implement abstract method")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("Buddy")
cat = Cat("Whiskers")
print(dog.speak()) # 輸出: Buddy says woof!
print(cat.speak()) # 輸出: Whiskers says meow!
3.多態(Polymorphism)
????????多態是指同一個方法調用在不同對象上產生不同的行為。在Python中,多態通過繼承和方法重寫實現。
# 繼續使用上面的Animal、Dog和Cat類def animal_sound(animal):print(animal.speak())animals = [Dog("Buddy"), Cat("Whiskers")]
for animal in animals:animal_sound(animal) # 分別輸出: Buddy says woof! 和 Whiskers says meow!
三、類成員詳解
????????類成員是面向對象編程的核心概念,Python中的類成員主要分為三類:屬性、方法和特殊成員。下面詳細解析各類成員的特性和用法:
1.屬性(Attributes)
類型 | 定義方式 | 訪問方式 | 特點 | 示例 |
---|---|---|---|---|
實例屬性 | self.attr = value | obj.attr | 每個對象獨立 | self.name = "Alice" |
類屬性 | 類內部直接定義 | Class.attr | 所有實例共享 | species = "Human" |
保護屬性 | _attr (單下劃線前綴) | obj._attr | 約定私有,可訪問 | self._id = 123 |
私有屬性 | __attr (雙下劃線前綴) | obj._Class__attr | 名稱修飾,強私有 | self.__password = "***" |
?(1).類屬性
類屬性是屬于類的,所有對象共享該屬性。
class Circle:# 類屬性pi = 3.14159def __init__(self, radius):self.radius = radiusdef area(self):return Circle.pi * self.radius ** 2circle1 = Circle(5)
circle2 = Circle(10)print(circle1.area()) # 輸出: 78.53975
print(circle2.area()) # 輸出: 314.159
(2).實例屬性
實例屬性是屬于對象的,每個對象可以有不同的屬性值。
class Dog:def __init__(self, name, breed):# 實例屬性self.name = nameself.breed = breeddog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Max", "German Shepherd")print(dog1.name) # 輸出: Buddy
print(dog2.breed) # 輸出: German Shepherd
?綜合案例:
class User:# 類屬性(所有用戶共享)platform = "WebApp"def __init__(self, name):# 實例屬性(每個用戶獨立)self.name = name# 保護屬性(約定私有)self._session_id = id(self)# 私有屬性(強私有)self.__password = "default"# 訪問示例
u = User("Alice")
print(u.platform) # 類屬性 → "WebApp"
print(u.name) # 實例屬性 → "Alice"
print(u._session_id) # 保護屬性 → 123456
print(u.__password) # 報錯!AttributeError
print(u._User__password) # 私有屬性 → "default"(不推薦)
2.方法(Methods)
類型 | 定義方式 | 調用方式 | 特點 | 參數要求 |
---|---|---|---|---|
實例方法 | def method(self, ...): | obj.method() | 可訪問實例/類屬性 | 必須包含self |
類方法 | @classmethod | Class.method() | 操作類屬性,創建工廠方法 | 必須包含cls |
靜態方法 | @staticmethod | Class.method() | 功能獨立,無狀態依賴 | 無特殊參數 |
(1). 實例方法
實例方法是屬于對象的方法,第一個參數通常是?self
,用于引用對象本身。
class Rectangle:def __init__(self, length, width):self.length = lengthself.width = width# 實例方法def area(self):return self.length * self.widthrect = Rectangle(5, 10)
print(rect.area()) # 輸出: 50
(2).類方法
????????類方法是屬于類的方法,使用?@classmethod
?裝飾器定義,第一個參數通常是?cls
,用于引用類本身。
class Pizza:def __init__(self, radius, ingredients):self.radius = radiusself.ingredients = ingredients@classmethoddef margherita(cls):return cls(12, ["tomato sauce", "mozzarella", "basil"])@classmethoddef pepperoni(cls):return cls(14, ["tomato sauce", "mozzarella", "pepperoni"])pizza1 = Pizza.margherita()
pizza2 = Pizza.pepperoni()print(pizza1.ingredients) # 輸出: ['tomato sauce', 'mozzarella', 'basil']
print(pizza2.radius) # 輸出: 14
(3).靜態方法
靜態方法是屬于類的方法,使用?@staticmethod
?裝飾器定義,不需要?self
?或?cls
?參數。
class Math:@staticmethoddef add(a, b):return a + bresult = Math.add(3, 5)
print(result) # 輸出: 8
綜合案例:?
class Calculator:# 類屬性PI = 3.14159# 實例方法def add(self, a, b):return a + b# 類方法@classmethoddef circle_area(cls, radius):return cls.PI * radius ** 2# 靜態方法@staticmethoddef is_even(num):return num % 2 == 0# 調用示例
calc = Calculator()
calc.add(2, 3) # 實例方法 → 5
Calculator.circle_area(2) # 類方法 → 12.56636
Calculator.is_even(7) # 靜態方法 → False
3.特殊成員(魔術方法)
????????魔術方法(Magic Methods)是 Python 面向對象編程的核心特性,它們以雙下劃線開頭和結尾(如?__init__
),用于定義類的特殊行為。這些方法會在特定操作發生時自動調用,讓自定義類擁有類似內置類型的行為。
類別 | 常用方法 | 觸發場景 |
---|---|---|
對象生命周期 | __new__ ,?__init__ ,?__del__ | 創建、初始化、銷毀對象 |
字符串表示 | __str__ ,?__repr__ ,?__format__ | print() ,?str() ,?format() |
運算符重載 | __add__ ,?__sub__ ,?__mul__ ,?__eq__ ,?__lt__ ?等 | + ,?- ,?* ,?== ,?< ?等操作 |
容器行為 | __len__ ,?__getitem__ ,?__setitem__ ,?__contains__ ,?__iter__ | len() ,?[] ,?in ,?for 循環 |
屬性訪問 | __getattr__ ,?__getattribute__ ,?__setattr__ ,?__delattr__ | 屬性訪問、設置、刪除 |
可調用對象 | __call__ | obj() ?函數式調用 |
上下文管理 | __enter__ ,?__exit__ | with ?語句 |
數值轉換 | __int__ ,?__float__ ,?__bool__ | int() ,?float() ,?bool() |
1. 對象生命周期方法
class Lifecycle:def __new__(cls, *args, **kwargs):print("創建對象(內存分配)")return super().__new__(cls)def __init__(self, name):print(f"初始化對象: {name}")self.name = namedef __del__(self):print(f"銷毀對象: {self.name}")obj = Lifecycle("Test") # 輸出: 創建對象 → 初始化對象: Test
del obj # 輸出: 銷毀對象: Test
2. 字符串表示方法
class Person:def __init__(self, name, age):self.name = nameself.age = age# 用戶友好展示def __str__(self):return f"{self.name} ({self.age}歲)"# 開發者調試/重建對象def __repr__(self):return f"Person('{self.name}', {self.age})"# 格式化輸出def __format__(self, format_spec):if format_spec == 'short':return self.name[0].upper()return str(self)p = Person("張三", 30)
print(str(p)) # 張三 (30歲)
print(repr(p)) # Person('張三', 30)
print(f"{p:short}") # 張
?其他不在一一展示
class Vector2D:def __init__(self, x, y):self.x = xself.y = y# 字符串表示(用戶友好)def __str__(self):return f"({self.x}, {self.y})"# 運算符重載(向量加法)def __add__(self, other):return Vector2D(self.x + other.x, self.y + other.y)# 長度定義(模長)def __len__(self):return int((self.x**2 + self.y**2)**0.5)v1 = Vector2D(3, 4)
v2 = Vector2D(1, 2)
print(v1) # 觸發__str__ → (3, 4)
print(v1 + v2) # 觸發__add__ → (4, 6)
print(len(v1)) # 觸發__len__ → 5
四、高級特性
1.屬性訪問控制
@property
裝飾器實現屬性保護
class Temperature:def __init__(self, celsius):self._celsius = celsius # 保護屬性@propertydef celsius(self): # Getterreturn self._celsius@celsius.setterdef celsius(self, value):if value < -273.15:raise ValueError("Too cold")self._celsius = value
2.抽象基類(ABC)
定義接口規范
from abc import ABC, abstractmethodclass Animal(ABC):@abstractmethoddef speak(self):passclass Cat(Animal):def speak(self): # 必須實現抽象方法return "Meow"