Python高级核心技术解析:内存管理、并发编程与元编程实战
·
很多Python开发者在掌握了基础语法后,会发现实际项目中经常遇到性能瓶颈、内存泄漏或并发问题。本文系统梳理Python高级核心技术,涵盖内存管理、并发编程、元编程等关键领域,通过完整代码示例和性能对比,帮助中高级开发者突破技术瓶颈。
1. Python内存管理与垃圾回收机制
1.1 引用计数与循环引用
Python使用引用计数作为主要的内存管理机制。每个对象都有一个引用计数,当引用计数为0时,对象会被立即回收。
import sys
class DataNode:
def __init__(self, value):
self.value = value
self.next = None
# 引用计数示例
node1 = DataNode("A")
print(f"初始引用计数: {sys.getrefcount(node1)}") # 输出2(node1和getrefcount参数各一个引用)
node2 = node1
print(f"赋值后引用计数: {sys.getrefcount(node1)}") # 输出3
del node2
print(f"删除node2后引用计数: {sys.getrefcount(node1)}") # 输出2
循环引用是引用计数无法解决的问题,这时需要依赖垃圾回收器的标记-清除算法:
def create_cycle():
"""创建循环引用示例"""
a = []
b = [a]
a.append(b) # 创建循环引用
return a
cycle_obj = create_cycle()
# 此时a和b相互引用,引用计数永远不会为0
1.2 垃圾回收器的工作原理
Python的gc模块提供了对垃圾回收的控制能力:
import gc
import weakref
class Resource:
def __init__(self, name):
self.name = name
print(f"Resource {self.name} 被创建")
def __del__(self):
print(f"Resource {self.name} 被销毁")
# 手动控制垃圾回收
gc.disable() # 临时禁用自动垃圾回收
# 创建对象
res1 = Resource("重要资源")
res2 = Resource("临时资源")
# 使用弱引用避免循环引用
weak_ref = weakref.ref(res2)
# 手动触发垃圾回收
gc.enable()
collected = gc.collect()
print(f"回收了 {collected} 个对象")
# 验证弱引用
if weak_ref() is None:
print("对象已被回收")
else:
print("对象仍然存在")
1.3 内存优化实践
对于需要处理大量数据的场景,合理的内存管理至关重要:
import tracemalloc
from memory_profiler import profile
class EfficientDataProcessor:
def __init__(self):
self._cache = {}
self._large_data = bytearray(1024 * 1024) # 1MB数据
@profile
def process_large_dataset(self, data_size):
"""处理大型数据集的内存优化示例"""
# 使用生成器避免一次性加载所有数据
data_generator = (i * 2 for i in range(data_size))
# 分批处理数据
batch_size = 1000
results = []
for i, item in enumerate(data_generator):
results.append(item)
if len(results) >= batch_size:
# 处理批次数据
self._process_batch(results)
results.clear() # 及时清空列表
return len(results)
def _process_batch(self, batch):
"""处理数据批次"""
return sum(batch)
# 内存使用监控
tracemalloc.start()
processor = EfficientDataProcessor()
processor.process_large_dataset(10000)
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print("内存使用统计:")
for stat in top_stats[:5]:
print(stat)
2. 并发编程与异步IO
2.1 多线程与GIL限制
Python的全局解释器锁(GIL)限制了多线程的CPU密集型任务性能,但I/O密集型任务仍能受益:
import threading
import time
import requests
from concurrent.futures import ThreadPoolExecutor
class ThreadingExample:
def __init__(self):
self.results = []
self.lock = threading.Lock()
def cpu_bound_task(self, n):
"""CPU密集型任务(受GIL限制)"""
return sum(i * i for i in range(n))
def io_bound_task(self, url):
"""I/O密集型任务(适合多线程)"""
try:
response = requests.get(url, timeout=5)
with self.lock: # 使用锁保证线程安全
self.results.append({
'url': url,
'status_code': response.status_code,
'content_length': len(response.content)
})
return response.status_code
except Exception as e:
return f"Error: {e}"
def run_concurrent_downloads(self, urls):
"""并发下载示例"""
start_time = time.time()
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(self.io_bound_task, url) for url in urls]
# 等待所有任务完成
for future in futures:
future.result()
end_time = time.time()
print(f"下载完成,耗时: {end_time - start_time:.2f}秒")
return self.results
# 使用示例
example = ThreadingExample()
urls = [
'https://httpbin.org/delay/1',
'https://httpbin.org/delay/2',
'https://httpbin.org/delay/1'
] * 3 # 9个URL
results = example.run_concurrent_downloads(urls)
print(f"成功下载 {len(results)} 个页面")
2.2 多进程编程
对于CPU密集型任务,多进程可以绕过GIL限制:
import multiprocessing as mp
import time
from math import sqrt
def is_prime(n):
"""判断质数(CPU密集型任务)"""
if n < 2:
return False
for i in range(2, int(sqrt(n)) + 1):
if n % i == 0:
return False
return True
def find_primes_in_range(start, end, result_queue):
"""在指定范围内查找质数"""
primes = []
for num in range(start, end + 1):
if is_prime(num):
primes.append(num)
result_queue.put((start, end, primes))
class MultiProcessPrimeFinder:
def __init__(self, num_processes=None):
self.num_processes = num_processes or mp.cpu_count()
def find_primes_parallel(self, max_number):
"""使用多进程并行查找质数"""
start_time = time.time()
# 计算每个进程处理的范围
chunk_size = max_number // self.num_processes
ranges = []
for i in range(self.num_processes):
start = i * chunk_size + 1
end = (i + 1) * chunk_size if i < self.num_processes - 1 else max_number
ranges.append((start, end))
# 创建进程池
result_queue = mp.Queue()
processes = []
for start, end in ranges:
p = mp.Process(target=find_primes_in_range,
args=(start, end, result_queue))
processes.append(p)
p.start()
# 收集结果
all_primes = []
for _ in range(len(ranges)):
start, end, primes = result_queue.get()
all_primes.extend(primes)
print(f"进程完成范围 {start}-{end}, 找到 {len(primes)} 个质数")
# 等待所有进程结束
for p in processes:
p.join()
end_time = time.time()
print(f"找到 {len(all_primes)} 个质数,耗时: {end_time - start_time:.2f}秒")
return sorted(all_primes)
# 性能对比测试
if __name__ == "__main__":
finder = MultiProcessPrimeFinder()
# 单进程版本
start_time = time.time()
single_primes = [n for n in range(1, 100000) if is_prime(n)]
single_time = time.time() - start_time
# 多进程版本
multi_primes = finder.find_primes_parallel(100000)
multi_time = time.time() - start_time - single_time
print(f"单进程耗时: {single_time:.2f}秒")
print(f"多进程耗时: {multi_time:.2f}秒")
print(f"加速比: {single_time/multi_time:.2f}x")
2.3 异步编程与asyncio
异步编程是现代Python开发的重要技能:
import asyncio
import aiohttp
import time
from typing import List, Dict
class AsyncWebCrawler:
def __init__(self, max_concurrent=10):
self.max_concurrent = max_concurrent
self.semaphore = asyncio.Semaphore(max_concurrent)
async def fetch_url(self, session: aiohttp.ClientSession, url: str) -> Dict:
"""异步获取单个URL"""
async with self.semaphore: # 限制并发数量
try:
async with session.get(url, timeout=aiohttp.ClientTimeout(total=10)) as response:
content = await response.text()
return {
'url': url,
'status': response.status,
'content_length': len(content),
'success': True
}
except Exception as e:
return {
'url': url,
'status': 0,
'error': str(e),
'success': False
}
async def crawl_multiple_urls(self, urls: List[str]) -> List[Dict]:
"""并发爬取多个URL"""
connector = aiohttp.TCPConnector(limit=self.max_concurrent)
async with aiohttp.ClientSession(connector=connector) as session:
tasks = [self.fetch_url(session, url) for url in urls]
results = await asyncio.gather(*tasks)
return results
def run_crawl(self, urls: List[str]):
"""运行爬虫"""
start_time = time.time()
# 运行异步任务
loop = asyncio.get_event_loop()
results = loop.run_until_complete(self.crawl_multiple_urls(urls))
end_time = time.time()
successful = sum(1 for r in results if r['success'])
print(f"爬取完成: {successful}/{len(urls)} 成功, 耗时: {end_time-start_time:.2f}秒")
return results
# 异步编程的高级用法
class AsyncDataProcessor:
def __init__(self):
self.data_queue = asyncio.Queue()
self.processed_data = []
async def producer(self, data_items):
"""生产者协程"""
for item in data_items:
await self.data_queue.put(item)
await asyncio.sleep(0.1) # 模拟生产延迟
await self.data_queue.put(None) # 结束信号
async def consumer(self, consumer_id):
"""消费者协程"""
while True:
item = await self.data_queue.get()
if item is None:
# 将结束信号放回队列,让其他消费者也能收到
await self.data_queue.put(None)
break
# 处理数据
processed = f"Consumer-{consumer_id} processed: {item.upper()}"
self.processed_data.append(processed)
await asyncio.sleep(0.2) # 模拟处理延迟
self.data_queue.task_done()
async def run_pipeline(self, data_items, num_consumers=3):
"""运行生产消费管道"""
# 启动生产者
producer_task = asyncio.create_task(self.producer(data_items))
# 启动消费者
consumer_tasks = [
asyncio.create_task(self.consumer(i))
for i in range(num_consumers)
]
# 等待生产完成
await producer_task
# 等待所有数据处理完成
await self.data_queue.join()
# 取消消费者任务
for task in consumer_tasks:
task.cancel()
return self.processed_data
# 使用示例
async def main():
# 异步爬虫示例
crawler = AsyncWebCrawler(max_concurrent=5)
test_urls = ['https://httpbin.org/get'] * 10
results = await crawler.crawl_multiple_urls(test_urls)
# 异步数据处理示例
processor = AsyncDataProcessor()
data = ['item1', 'item2', 'item3', 'item4', 'item5']
processed = await processor.run_pipeline(data, num_consumers=2)
print("处理结果:", processed)
# 运行异步主函数
if __name__ == "__main__":
asyncio.run(main())
3. 元编程与装饰器高级用法
3.1 装饰器模式深入理解
装饰器是Python元编程的重要工具:
from functools import wraps
import time
import logging
from typing import Any, Callable
class AdvancedDecorators:
"""高级装饰器示例"""
@staticmethod
def retry(max_attempts: int = 3, delay: float = 1.0):
"""重试装饰器"""
def decorator(func: Callable) -> Callable:
@wraps(func)
def wrapper(*args, **kwargs) -> Any:
last_exception = None
for attempt in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
last_exception = e
if attempt < max_attempts - 1:
time.sleep(delay * (2 ** attempt)) # 指数退避
logging.warning(f"尝试 {attempt + 1} 失败,重试...")
else:
logging.error(f"所有 {max_attempts} 次尝试都失败了")
raise last_exception
return wrapper
return decorator
@staticmethod
def cache_result(ttl: int = 300):
"""缓存装饰器(带过期时间)"""
def decorator(func: Callable) -> Callable:
cache = {}
@wraps(func)
def wrapper(*args, **kwargs) -> Any:
# 创建缓存键
key = str(args) + str(sorted(kwargs.items()))
# 检查缓存是否存在且未过期
if key in cache:
result, timestamp = cache[key]
if time.time() - timestamp < ttl:
return result
# 执行函数并缓存结果
result = func(*args, **kwargs)
cache[key] = (result, time.time())
return result
# 添加缓存管理方法
wrapper.clear_cache = lambda: cache.clear()
wrapper.get_cache_size = lambda: len(cache)
return wrapper
return decorator
@staticmethod
def timing_decorator(func: Callable) -> Callable:
"""计时装饰器"""
@wraps(func)
def wrapper(*args, **kwargs) -> Any:
start_time = time.perf_counter()
result = func(*args, **kwargs)
end_time = time.perf_counter()
print(f"函数 {func.__name__} 执行时间: {end_time - start_time:.6f}秒")
return result
return wrapper
# 装饰器使用示例
class DataService:
def __init__(self):
self.call_count = 0
@AdvancedDecorators.retry(max_attempts=3, delay=1)
@AdvancedDecorators.cache_result(ttl=60)
@AdvancedDecorators.timing_decorator
def expensive_operation(self, x: int, y: int) -> int:
"""模拟昂贵操作"""
self.call_count += 1
# 模拟随机失败
if self.call_count % 5 == 1:
raise ValueError("模拟失败")
time.sleep(0.5) # 模拟耗时操作
return x * y + 123
# 测试装饰器
service = DataService()
try:
# 第一次调用(会缓存)
result1 = service.expensive_operation(10, 20)
print(f"结果1: {result1}")
# 第二次调用(从缓存读取)
result2 = service.expensive_operation(10, 20)
print(f"结果2: {result2}")
# 不同参数调用
result3 = service.expensive_operation(5, 15)
print(f"结果3: {result3}")
except Exception as e:
print(f"操作失败: {e}")
3.2 元类编程
元类允许在类创建时进行干预,实现高级的类定制:
class SingletonMeta(type):
"""单例模式元类"""
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
instance = super().__call__(*args, **kwargs)
cls._instances[cls] = instance
return cls._instances[cls]
class DatabaseConnection(metaclass=SingletonMeta):
"""数据库连接单例"""
def __init__(self, connection_string):
self.connection_string = connection_string
self._connect()
def _connect(self):
print(f"连接到数据库: {self.connection_string}")
# 实际的连接逻辑...
class ValidatedMeta(type):
"""验证型元类:检查类属性是否符合要求"""
def __new__(cls, name, bases, namespace):
# 检查必须实现的抽象方法
if 'abstract_method' in namespace and callable(namespace['abstract_method']):
# 检查方法是否有文档字符串
if not namespace['abstract_method'].__doc__:
raise TypeError(f"类 {name} 的 abstract_method 必须包含文档字符串")
# 自动添加类版本信息
namespace['__version__'] = '1.0.0'
return super().__new__(cls, name, bases, namespace)
class ModelBase(metaclass=ValidatedMeta):
"""模型基类"""
def abstract_method(self):
"""这是一个必须实现的抽象方法"""
raise NotImplementedError("子类必须实现此方法")
class AdvancedMetaClass(type):
"""高级元类示例:自动注册子类"""
_registry = {}
def __new__(cls, name, bases, namespace):
new_class = super().__new__(cls, name, bases, namespace)
# 自动注册非抽象类
if not name.startswith('Abstract'):
cls._registry[name] = new_class
print(f"注册类: {name}")
# 自动添加类方法
@classmethod
def get_registry(cls_method):
return cls._registry
new_class.get_registry = get_registry
return new_class
# 使用元类
class DataProcessor(metaclass=AdvancedMetaClass):
pass
class ImageProcessor(DataProcessor):
pass
class TextProcessor(DataProcessor):
pass
# 测试元类功能
print("已注册的类:", DataProcessor.get_registry().keys())
3.3 描述符协议
描述符提供了对属性访问的精细控制:
class ValidatedAttribute:
"""验证描述符"""
def __init__(self, name, expected_type, min_value=None, max_value=None):
self.name = name
self.expected_type = expected_type
self.min_value = min_value
self.max_value = max_value
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__.get(self.name, None)
def __set__(self, instance, value):
if not isinstance(value, self.expected_type):
raise TypeError(f"{self.name} 必须是 {self.expected_type} 类型")
if self.min_value is not None and value < self.min_value:
raise ValueError(f"{self.name} 不能小于 {self.min_value}")
if self.max_value is not None and value > self.max_value:
raise ValueError(f"{self.name} 不能大于 {self.max_value}")
instance.__dict__[self.name] = value
class CachedProperty:
"""缓存属性描述符"""
def __init__(self, func):
self.func = func
self.name = func.__name__
def __get__(self, instance, owner):
if instance is None:
return self
# 检查缓存
cache_attr = f"_{self.name}_cached"
if not hasattr(instance, cache_attr):
value = self.func(instance)
setattr(instance, cache_attr, value)
return getattr(instance, cache_attr)
class Person:
"""使用描述符的Person类"""
# 使用验证描述符
age = ValidatedAttribute('age', int, min_value=0, max_value=150)
name = ValidatedAttribute('name', str)
def __init__(self, name, age):
self.name = name
self.age = age
@CachedProperty
def display_info(self):
"""缓存的计算属性"""
print("计算显示信息...")
return f"{self.name} ({self.age} 岁)"
# 测试描述符
try:
person = Person("张三", 25)
print(person.display_info) # 第一次计算
print(person.display_info) # 从缓存读取
# 测试验证功能
person.age = 30 # 正常
print(f"修改后年龄: {person.age}")
# 测试异常情况
person.age = -5 # 会抛出异常
except (ValueError, TypeError) as e:
print(f"验证错误: {e}")
4. 性能优化与高级数据结构
4.1 内置数据结构的高级用法
Python内置数据结构有很多高级特性:
from collections import defaultdict, Counter, deque, namedtuple
import heapq
from bisect import bisect_left, insort
from array import array
class AdvancedDataStructures:
"""高级数据结构用法示例"""
@staticmethod
def defaultdict_example():
"""defaultdict自动初始化示例"""
word_counts = defaultdict(int)
text = "hello world hello python world python python"
for word in text.split():
word_counts[word] += 1 # 不需要检查key是否存在
return dict(word_counts)
@staticmethod
def counter_example():
"""Counter计数示例"""
inventory = Counter(apple=10, orange=5, banana=3)
# 添加新货物
new_shipment = Counter(apple=5, orange=3, grape=8)
inventory.update(new_shipment)
# 最常见的物品
return inventory.most_common(2)
@staticmethod
def deque_example():
"""双端队列示例"""
dq = deque(maxlen=3) # 固定长度队列
for i in range(5):
dq.append(i)
print(f"添加 {i}: {list(dq)}")
# 从左侧操作
dq.appendleft(99)
print(f"左侧添加后: {list(dq)}")
return dq
@staticmethod
def heapq_example():
"""堆队列示例"""
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
heapq.heapify(numbers) # 转换为堆
print("堆:", numbers)
print("最小的3个元素:", heapq.nsmallest(3, numbers))
# 添加新元素
heapq.heappush(numbers, 0)
print("添加0后:", numbers)
return numbers
class EfficientAlgorithms:
"""高效算法实现"""
@staticmethod
def binary_search_example():
"""二分查找示例"""
data = sorted([5, 2, 8, 1, 9, 3, 7, 4, 6])
target = 7
# 使用bisect模块
pos = bisect_left(data, target)
found = pos < len(data) and data[pos] == target
print(f"数据: {data}")
print(f"查找 {target}: 位置 {pos}, 找到: {found}")
# 插入保持有序
insort(data, 5.5)
print(f"插入5.5后: {data}")
return found, pos
@staticmethod
def array_memory_efficiency():
"""数组内存效率示例"""
# 列表 vs 数组
import sys
# 整数列表
int_list = list(range(1000))
list_size = sys.getsizeof(int_list)
# 整数数组
int_array = array('i', range(1000))
array_size = sys.getsizeof(int_array)
print(f"列表大小: {list_size} 字节")
print(f"数组大小: {array_size} 字节")
print(f"内存节省: {(list_size - array_size) / list_size * 100:.1f}%")
return list_size, array_size
# 测试高级数据结构
print("=== 高级数据结构示例 ===")
print("单词计数:", AdvancedDataStructures.defaultdict_example())
print("最常见水果:", AdvancedDataStructures.counter_example())
print("双端队列:", list(AdvancedDataStructures.deque_example()))
print("堆操作:", AdvancedDataStructures.heapq_example())
print("\n=== 高效算法示例 ===")
EfficientAlgorithms.binary_search_example()
EfficientAlgorithms.array_memory_efficiency()
4.2 生成器与迭代器高级模式
生成器是Python中重要的性能优化工具:
class GeneratorPatterns:
"""生成器高级模式"""
@staticmethod
def memory_efficient_file_reader(filename, chunk_size=8192):
"""内存高效的文件读取器"""
with open(filename, 'r', encoding='utf-8') as file:
while True:
chunk = file.read(chunk_size)
if not chunk:
break
yield chunk
@staticmethod
def pipeline_processing():
"""生成器管道处理模式"""
def number_generator(n):
for i in range(n):
yield i
def filter_even(numbers):
for num in numbers:
if num % 2 == 0:
yield num
def square(numbers):
for num in numbers:
yield num ** 2
# 构建处理管道
numbers = number_generator(10)
even_numbers = filter_even(numbers)
squared_evens = square(even_numbers)
return list(squared_evens)
@staticmethod
def coroutine_pattern():
"""协程模式生成器"""
def coroutine_manager():
"""协程管理器"""
results = []
def worker(name, target):
"""工作协程"""
for i in range(3):
result = f"{name}-{i}: {target}"
results.append(result)
yield result
# 创建多个工作协程
workers = [
worker("WorkerA", "Task1"),
worker("WorkerB", "Task2"),
worker("WorkerC", "Task3")
]
# 轮询执行
while workers:
for worker_coro in workers[:]:
try:
next(worker_coro)
except StopIteration:
workers.remove(worker_coro)
return results
return coroutine_manager()
class AdvancedIteration:
"""高级迭代技巧"""
@staticmethod
def itertools_patterns():
"""itertools高级用法"""
import itertools
# 无限迭代器
counter = itertools.count(start=10, step=2)
first_5 = [next(counter) for _ in range(5)]
print("计数器:", first_5)
# 排列组合
combinations = list(itertools.combinations('ABC', 2))
permutations = list(itertools.permutations('ABC', 2))
print("组合:", combinations)
print("排列:", permutations)
# 分组操作
data = [1, 1, 2, 2, 3, 3, 3]
grouped = {k: list(v) for k, v in itertools.groupby(data)}
print("分组:", grouped)
return combinations, permutations
# 测试生成器模式
print("=== 生成器高级模式 ===")
print("管道处理结果:", GeneratorPatterns.pipeline_processing())
print("协程模式结果:", GeneratorPatterns.coroutine_pattern())
print("\n=== 高级迭代技巧 ===")
AdvancedIteration.itertools_patterns()
5. 高级面向对象编程技巧
5.1 抽象基类与接口设计
使用ABC模块定义清晰的接口:
from abc import ABC, abstractmethod
from typing import List, Dict, Any
class DataProcessor(ABC):
"""数据处理抽象基类"""
@abstractmethod
def load_data(self, source: Any) -> List[Dict]:
"""加载数据"""
pass
@abstractmethod
def process_data(self, data: List[Dict]) -> List[Dict]:
"""处理数据"""
pass
@abstractmethod
def save_data(self, data: List[Dict], destination: Any) -> bool:
"""保存数据"""
pass
def execute_pipeline(self, source: Any, destination: Any) -> bool:
"""执行完整处理管道"""
try:
raw_data = self.load_data(source)
processed_data = self.process_data(raw_data)
return self.save_data(processed_data, destination)
except Exception as e:
print(f"处理失败: {e}")
return False
class CSVProcessor(DataProcessor):
"""CSV数据处理器"""
def load_data(self, source: str) -> List[Dict]:
print(f"从CSV文件加载数据: {source}")
# 实际的文件读取逻辑
return [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
def process_data(self, data: List[Dict]) -> List[Dict]:
print("处理CSV数据...")
for item in data:
item["processed"] = True
return data
def save_data(self, data: List[Dict], destination: str) -> bool:
print(f"保存数据到: {destination}")
return True
class MixinPattern:
"""Mixin模式示例"""
class JSONSerializableMixin:
"""JSON序列化Mixin"""
def to_json(self) -> str:
import json
return json.dumps(self.__dict__)
@classmethod
def from_json(cls, json_str: str):
data = json.loads(json_str)
instance = cls.__new__(cls)
instance.__dict__.update(data)
return instance
class TimestampMixin:
"""时间戳Mixin"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
from datetime import datetime
self.created_at = datetime.now()
self.updated_at = datetime.now()
def update_timestamp(self):
from datetime import datetime
self.updated_at = datetime.now()
class User(TimestampMixin, JSONSerializableMixin):
"""使用Mixin的User类"""
def __init__(self, name: str, email: str):
super().__init__()
self.name = name
self.email = email
# 测试抽象基类和Mixin
print("=== 抽象基类与Mixin模式 ===")
# 测试CSV处理器
csv_processor = CSVProcessor()
success = csv_processor.execute_pipeline("input.csv", "output.csv")
print(f"处理结果: {'成功' if success else '失败'}")
# 测试Mixin模式
user = User("张三", "zhangsan@example.com")
print("用户JSON:", user.to_json())
print("创建时间:", user.created_at)
user.update_timestamp()
print("更新时间:", user.updated_at)
5.2 上下文管理器高级用法
上下文管理器不仅用于资源管理:
class AdvancedContextManagers:
"""高级上下文管理器示例"""
class TimerContext:
"""计时上下文管理器"""
def __enter__(self):
import time
self.start_time = time.perf_counter()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
import time
self.end_time = time.perf_counter()
self.duration = self.end_time - self.start_time
print(f"代码块执行时间: {self.duration:.6f}秒")
class DatabaseTransaction:
"""数据库事务上下文管理器"""
def __enter__(self):
print("开始数据库事务")
self.connection = self._create_connection()
self.connection.begin()
return self.connection
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is None:
print("提交事务")
self.connection.commit()
else:
print("回滚事务")
self.connection.rollback()
self.connection.close()
def _create_connection(self):
# 模拟数据库连接
class MockConnection:
def begin(self): print("事务开始")
def commit(self): print("事务提交")
def rollback(self): print("事务回滚")
def close(self): print("连接关闭")
return MockConnection()
class ChangeDirectory:
"""目录切换上下文管理器"""
def __init__(self, new_path):
import os
self.new_path = new_path
self.old_path = os.getcwd()
def __enter__(self):
import os
os.chdir(self.new_path)
print(f"切换到目录: {self.new_path}")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
import os
os.chdir(self.old_path)
print(f"切换回目录: {self.old_path}")
# 使用上下文管理器
print("=== 高级上下文管理器 ===")
# 计时上下文
with AdvancedContextManagers.TimerContext():
import time
time.sleep(1) # 模拟耗时操作
# 数据库事务上下文
try:
with AdvancedContextManagers.DatabaseTransaction() as conn:
print("执行数据库操作...")
# 模拟操作成功
except Exception as e:
print(f"操作失败: {e}")
# 目录切换上下文
import tempfile
import os
with tempfile.TemporaryDirectory() as temp_dir:
with AdvancedContextManagers.ChangeDirectory(temp_dir):
print(f"当前目录: {os.getcwd()}")
# 在此目录下执行文件操作
6. 高级调试与性能分析
6.1 高级调试技巧
使用pdb进行交互式调试:
import pdb
import logging
from functools import wraps
class AdvancedDebugging:
"""高级调试技巧"""
@staticmethod
def debug_decorator(func):
"""调试装饰器"""
@wraps(func)
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
print(f"参数: args={args}, kwargs={kwargs}")
# 设置断点进行交互式调试
pdb.set_trace()
result = func(*args, **kwargs)
print(f"返回值: {result}")
return result
return wrapper
更多推荐


所有评论(0)