本文目录导读:

我来详细讲解Python案例封装复用的多种方法和最佳实践。
函数封装(基础复用)
# 原始案例:计算圆形面积
def calculate_circle_area(radius):
"""计算圆形面积"""
import math
return math.pi * radius ** 2
# 封装复用
def calculate_area(shape, *args):
"""
通用面积计算函数
:param shape: 形状类型 circle/rectangle/triangle
:param args: 对应参数
"""
import math
if shape == 'circle':
radius = args[0]
return math.pi * radius ** 2
elif shape == 'rectangle':
length, width = args
return length * width
elif shape == 'triangle':
base, height = args
return 0.5 * base * height
else:
raise ValueError(f"不支持的形状: {shape}")
# 使用示例
print(calculate_area('circle', 5)) # 圆形
print(calculate_area('rectangle', 4, 6)) # 矩形
类封装(面向对象复用)
class DataProcessor:
"""数据处理类封装"""
def __init__(self, data):
self.data = data
self.processed_data = None
def clean_data(self):
"""数据清洗"""
self.processed_data = [
item.strip() for item in self.data
if item and not item.isspace()
]
return self
def transform_data(self, func):
"""数据转换"""
if self.processed_data is None:
self.clean_data()
self.processed_data = [func(item) for item in self.processed_data]
return self
def filter_data(self, condition):
"""数据过滤"""
if self.processed_data is None:
self.clean_data()
self.processed_data = [
item for item in self.processed_data
if condition(item)
]
return self
def get_result(self):
"""获取结果"""
return self.processed_data
# 使用示例
processor = DataProcessor([" apple ", "banana", "", " cherry "])
result = (processor
.clean_data()
.transform_data(str.upper)
.filter_data(lambda x: len(x) > 5)
.get_result())
print(result) # ['BANANA', 'CHERRY']
装饰器封装(功能增强复用)
import time
from functools import wraps
def timer_decorator(func):
"""计时装饰器"""
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行时间: {end - start:.4f}秒")
return result
return wrapper
def cache_decorator(func):
"""缓存装饰器"""
cache = {}
@wraps(func)
def wrapper(*args, **kwargs):
# 创建缓存键
key = str(args) + str(sorted(kwargs.items()))
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
return wrapper
# 使用示例
@timer_decorator
@cache_decorator
def fibonacci(n):
"""斐波那契数列"""
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(30)) # 第一次计算并缓存
print(fibonacci(30)) # 从缓存读取
模块封装(项目级复用)
文件结构
project/
├── utils/
│ ├── __init__.py
│ ├── data_handler.py
│ └── validators.py
├── core/
│ ├── __init__.py
│ └── calculator.py
└── main.py
utils/validators.py
def validate_email(email):
"""验证邮箱格式"""
import re
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return bool(re.match(pattern, email))
def validate_phone(phone):
"""验证手机号"""
import re
pattern = r'^1[3-9]\d{9}$'
return bool(re.match(pattern, phone))
core/calculator.py
class StatisticsCalculator:
"""统计计算器"""
@staticmethod
def mean(data):
"""计算平均值"""
return sum(data) / len(data) if data else 0
@staticmethod
def median(data):
"""计算中位数"""
sorted_data = sorted(data)
n = len(sorted_data)
if n % 2 == 0:
return (sorted_data[n//2 - 1] + sorted_data[n//2]) / 2
return sorted_data[n//2]
@staticmethod
def standard_deviation(data):
"""计算标准差"""
import math
mean = StatisticsCalculator.mean(data)
variance = sum((x - mean) ** 2 for x in data) / len(data)
return math.sqrt(variance)
main.py
from utils.validators import validate_email, validate_phone
from core.calculator import StatisticsCalculator
# 使用工具函数
emails = ["test@example.com", "invalid-email"]
valid_emails = [email for email in emails if validate_email(email)]
print(f"有效邮箱: {valid_emails}")
# 使用统计计算器
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
calc = StatisticsCalculator()
print(f"平均值: {calc.mean(data)}")
print(f"中位数: {calc.median(data)}")
print(f"标准差: {calc.standard_deviation(data):.2f}")
配置文件封装(参数复用)
config/settings.py
import json
import os
from typing import Any, Dict
class Config:
"""配置管理类"""
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance._config = {}
return cls._instance
def load_from_file(self, filepath: str):
"""从文件加载配置"""
if not os.path.exists(filepath):
raise FileNotFoundError(f"配置文件不存在: {filepath}")
with open(filepath, 'r', encoding='utf-8') as f:
if filepath.endswith('.json'):
self._config = json.load(f)
elif filepath.endswith('.toml'):
import tomli
self._config = tomli.load(f)
return self
def get(self, key: str, default: Any = None) -> Any:
"""获取配置值"""
keys = key.split('.')
value = self._config
for k in keys:
if isinstance(value, dict):
value = value.get(k, default)
else:
return default
return value
def set(self, key: str, value: Any):
"""设置配置值"""
keys = key.split('.')
config = self._config
for k in keys[:-1]:
if k not in config:
config[k] = {}
config = config[k]
config[keys[-1]] = value
# 使用示例
config = Config()
config.load_from_file('config/app.json')
db_host = config.get('database.host', 'localhost')
db_port = config.get('database.port', 5432)
最佳实践建议
封装原则
# 1. 单一职责原则
class UserManager:
"""用户管理类 - 只负责用户相关操作"""
def create_user(self, username, email):
pass
def delete_user(self, user_id):
pass
def update_user(self, user_id, data):
pass
# 2. 接口简单易用
class EmailSender:
"""邮件发送器 - 简单接口"""
def send(self, to, subject, body):
"""简化的发送方法"""
return self._send_email(to, subject, body)
def _send_email(self, to, subject, body):
"""实际发送逻辑"""
# 实现细节
pass
# 3. 提供默认参数
def process_data(data, format='json', encoding='utf-8'):
"""数据处理函数,提供默认参数"""
if format == 'json':
import json
return json.dumps(data, ensure_ascii=False)
elif format == 'csv':
import csv
# 处理逻辑
pass
文档和测试
def calculate_discount(price: float, discount: float = 0.1) -> float:
"""
计算折扣价格
Args:
price: 原价
discount: 折扣率,默认0.1(10%)
Returns:
折扣后的价格
Raises:
ValueError: 当折扣率不在0-1之间时
"""
if not 0 <= discount <= 1:
raise ValueError(f"折扣率必须在0-1之间,当前为{discount}")
return price * (1 - discount)
# 测试用例
def test_calculate_discount():
assert calculate_discount(100) == 90
assert calculate_discount(100, 0.2) == 80
assert calculate_discount(0) == 0
import pytest
with pytest.raises(ValueError):
calculate_discount(100, 1.5)
这些封装方法可以让你在项目中高效复用代码,减少重复工作,提高开发效率,选择合适的封装方式取决于具体需求和场景。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播