很多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
    
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐