# Python面向對象編程及三大特性是什么
## 目錄
1. [面向對象編程概述](#一面向對象編程概述)
- 1.1 [什么是面向對象編程](#11-什么是面向對象編程)
- 1.2 [面向對象與面向過程對比](#12-面向對象與面向過程對比)
- 1.3 [Python中的OOP支持](#13-python中的oop支持)
2. [類與對象基礎](#二類與對象基礎)
- 2.1 [類的定義與實例化](#21-類的定義與實例化)
- 2.2 [屬性與方法詳解](#22-屬性與方法詳解)
- 2.3 [self關鍵字的本質](#23-self關鍵字的本質)
3. [三大特性之封裝](#三三大特性之封裝)
- 3.1 [封裝的概念與意義](#31-封裝的概念與意義)
- 3.2 [私有屬性和方法](#32-私有屬性和方法)
- 3.3 [屬性裝飾器@property](#33-屬性裝飾器property)
4. [三大特性之繼承](#四三大特性之繼承)
- 4.1 [繼承的基本語法](#41-繼承的基本語法)
- 4.2 [方法重寫與super()](#42-方法重寫與super)
- 4.3 [多重繼承與MRO](#43-多重繼承與mro)
5. [三大特性之多態](#五三大特性之多態)
- 5.1 [多態的概念理解](#51-多態的概念理解)
- 5.2 [鴨子類型機制](#52-鴨子類型機制)
- 5.3 [抽象基類abc模塊](#53-抽象基類abc模塊)
6. [面向對象高級特性](#六面向對象高級特性)
- 6.1 [類方法與靜態方法](#61-類方法與靜態方法)
- 6.2 [魔術方法詳解](#62-魔術方法詳解)
- 6.3 [元編程與元類](#63-元編程與元類)
7. [設計模式實踐](#七設計模式實踐)
- 7.1 [工廠模式實現](#71-工廠模式實現)
- 7.2 [單例模式實現](#72-單例模式實現)
- 7.3 [觀察者模式實現](#73-觀察者模式實現)
8. [實戰案例](#八實戰案例)
- 8.1 [圖形計算系統](#81-圖形計算系統)
- 8.2 [銀行賬戶系統](#82-銀行賬戶系統)
- 8.3 [電商商品管理](#83-電商商品管理)
## 一、面向對象編程概述
### 1.1 什么是面向對象編程
面向對象編程(Object-Oriented Programming,OOP)是一種以對象為核心的編程范式,它將數據和操作數據的方法組合成獨立的單元。根據IEEE定義,OOP具有以下核心特征:
- **對象**:具有狀態(屬性)和行為(方法)的實體
- **類**:創建對象的藍圖或模板
- **消息傳遞**:對象之間通過方法調用進行交互
```python
# 典型類定義示例
class Person:
def __init__(self, name):
self.name = name # 屬性
def greet(self): # 方法
return f"Hello, {self.name}!"
特性 | 面向過程 | 面向對象 |
---|---|---|
程序組成單元 | 函數 | 對象 |
數據與操作關系 | 分離 | 綁定 |
擴展方式 | 添加新函數 | 添加新類或繼承 |
典型語言 | C, Pascal | Java, Python |
適用場景 | 簡單邏輯、線性流程 | 復雜系統、高擴展性需求 |
Python自1991年誕生就支持OOP,其實現特點包括:
- 動態類型系統
- 多重繼承支持
- 豐富的魔術方法
- 鴨子類型機制
- 通過type
和abc
模塊提供元編程能力
類定義使用class
關鍵字,實例化通過調用類完成:
class Rectangle:
# 類屬性(所有實例共享)
shape = "四邊形"
def __init__(self, width, height):
# 實例屬性
self.width = width
self.height = height
# 實例化
rect = Rectangle(10, 20)
print(rect.shape) # 訪問類屬性
print(rect.width) # 訪問實例屬性
self
,操作實例屬性@classmethod
裝飾,操作類屬性@staticmethod
裝飾,與類無關class MyClass:
class_attr = 0
def instance_method(self):
return f"Instance {self}"
@classmethod
def class_method(cls):
return f"Class {cls}"
@staticmethod
def static_method():
return "Just a function"
self
是約定俗成的名稱,實際代表:
- 方法調用時的實例對象
- Python隱式傳遞的引用參數
- 可以重命名但不建議
class Demo:
def show(this): # 使用this代替self
print(this)
d = Demo()
d.show() # 輸出<__main__.Demo object>
封裝(Encapsulation)包含兩個層面: 1. 數據隱藏:保護內部實現細節 2. 接口暴露:提供可控訪問方式
優勢: - 降低耦合度 - 提高安全性 - 便于修改內部實現
Python通過命名約定實現偽私有化:
class BankAccount:
def __init__(self, balance):
self.__balance = balance # 雙下劃線前綴
def __verify(self): # 私有方法
print("Verifying...")
account = BankAccount(1000)
# account.__balance # 報錯
print(account._BankAccount__balance) # 仍然可以訪問(非嚴格私有)
實現屬性訪問控制:
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def celsius(self):
return self._celsius
@celsius.setter
def celsius(self, value):
if value < -273.15:
raise ValueError("低于絕對零度")
self._celsius = value
temp = Temperature(25)
temp.celsius = 30 # 調用setter
print(temp.celsius) # 調用getter
子類繼承父類的屬性和方法:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError
class Dog(Animal):
def speak(self):
return "Woof!"
dog = Dog("Buddy")
print(dog.speak()) # 輸出: Woof!
使用super()
調用父類方法:
class Parent:
def __init__(self, value):
self.value = value
class Child(Parent):
def __init__(self, value, extra):
super().__init__(value)
self.extra = extra
Python使用C3算法確定方法解析順序:
class A:
def show(self):
print("A")
class B(A):
def show(self):
print("B")
class C(A):
def show(self):
print("C")
class D(B, C):
pass
d = D()
d.show() # 輸出B
print(D.__mro__) # 查看方法解析順序
多態(Polymorphism)指同一操作作用于不同對象產生不同行為。Python通過以下方式實現:
“如果它走起來像鴨子,叫起來像鴨子,那么它就是鴨子”
class Duck:
def quack(self):
print("Quack!")
class Person:
def quack(self):
print("I'm quacking like a duck!")
def make_quack(obj):
obj.quack() # 不檢查類型,只關心行為
make_quack(Duck()) # 輸出: Quack!
make_quack(Person()) # 輸出: I'm quacking like a duck!
定義接口規范:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
# shape = Shape() # 報錯
circle = Circle(5)
print(circle.area())
class TimeUtil:
@classmethod
def from_timestamp(cls, ts):
return cls(ts // 1000)
@staticmethod
def is_valid_hour(hour):
return 0 <= hour < 24
常用魔術方法示例:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __str__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # 輸出: Vector(4, 6)
創建自定義元類:
class Meta(type):
def __new__(cls, name, bases, attrs):
attrs['created_by'] = 'meta'
return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=Meta):
pass
print(MyClass.created_by) # 輸出: meta
class CarFactory:
@staticmethod
def create_car(brand):
if brand == "BMW":
return BMW()
elif brand == "Audi":
return Audi()
raise ValueError(f"Unknown brand: {brand}")
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
a = Singleton()
b = Singleton()
print(a is b) # True
class Observer:
def update(self, message):
pass
class Subject:
def __init__(self):
self._observers = []
def attach(self, observer):
self._observers.append(observer)
def notify(self, message):
for observer in self._observers:
observer.update(message)
class Shape:
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class BankAccount:
def __init__(self, account_number, balance=0):
self.__account_number = account_number
self.__balance = balance
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount > self.__balance:
raise ValueError("余額不足")
self.__balance -= amount
@property
def balance(self):
return self.__balance
class Product:
def __init__(self, pid, name, price):
self.pid = pid
self.name = name
self.price = price
class ShoppingCart:
def __init__(self):
self.items = []
def add_item(self, product, quantity):
self.items.append((product, quantity))
def total(self):
return sum(p.price * q for p, q in self.items)
Python面向對象編程通過類與對象實現代碼組織,其三大核心特性: 1. 封裝:隱藏實現細節,暴露安全接口 2. 繼承:實現代碼復用和層次關系 3. 多態:增強程序靈活性和擴展性
掌握這些特性并結合Python特有的鴨子類型、魔術方法等高級特性,可以構建出結構清晰、易于維護的復雜系統。實際開發中應合理運用設計模式,避免過度設計,根據項目需求選擇適當的OOP實踐方式。 “`
注:本文實際字數為約5600字(含代碼),完整展示了Python面向對象編程的核心概念與實踐方法。如需調整具體內容或擴展某些部分,可以進一步修改補充。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。