首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入Python元编程:一次代码重构引发的架构思考

作为一位Python架构师,最近在重构一个大型遗留系统时,通过元编程技术将代码量减少了60%,同时提升了系统的可维护性。今天和大家分享这次重构的技术细节和设计思路。

一、问题背景

原始代码中存在大量重复模式:

# 原始代码:大量重复的数据处理类

class UserService:

  def get_user(self, user_id):

      return db.query(User).get(user_id)

  def create_user(self, data):

      user = User(**data)

      db.add(user)

      db.commit()

class OrderService:

  def get_order(self, order_id):

      return db.query(Order).get(order_id)

  def create_order(self, data):

      order = Order(**data)

      db.add(order)

      db.commit()

二、元编程改造方案

基于元类的服务工厂

class ServiceMetaclass(type):

  def __new__(mcs, name, bases, attrs):

      # 如果是基类,直接返回

      if name == 'BaseService':

          return super().__new__(mcs, name, bases, attrs)

      # 获取模型类

      model = attrs.get('__model__')

      ifnot model:

          raise TypeError(f"Service class {name} must define __model__")

      # 动态添加CRUD方法

      attrs['get'] = lambda self, id: self.session.query(model).get(id)

      attrs['create'] = lambda self, data: self._create(model, data)

      attrs['update'] = lambda self, id, data: self._update(model, id, data)

      attrs['delete'] = lambda self, id: self._delete(model, id)

      return super().__new__(mcs, name, bases, attrs)

class BaseService(metaclass=ServiceMetaclass):

  def __init__(self, session):

      self.session = session

  def _create(self, model, data):

      instance = model(**data)

      self.session.add(instance)

      self.session.commit()

      return instance

  def _update(self, model, id, data):

      instance = self.session.query(model).get(id)

      for key, value in data.items():

          setattr(instance, key, value)

      self.session.commit()

      return instance

  def _delete(self, model, id):

      instance = self.session.query(model).get(id)

      self.session.delete(instance)

      self.session.commit()

装饰器工厂

class DecoratorFactory:

  @staticmethod

  def validate(schema):

      def decorator(func):

          @wraps(func)

          asyncdef wrapper(*args, **kwargs):

              data = kwargs.get('data', {})

              try:

                  validated_data = schema.validate(data)

                  kwargs['data'] = validated_data

                  returnawait func(*args, **kwargs)

              except ValidationError as e:

                  raise HTTPException(

                      status_code=400,

                      detail=str(e)

                  )

          return wrapper

      return decorator

  @staticmethod

  def cache(ttl=300):

      def decorator(func):

          @wraps(func)

          asyncdef wrapper(self, *args, **kwargs):

              cache_key = f"{func.__name__}:{args}:{kwargs}"

              cached = await self.redis.get(cache_key)

              if cached:

                  return json.loads(cached)

              result = await func(self, *args, **kwargs)

              await self.redis.setex(

                  cache_key,

                  ttl,

                  json.dumps(result)

              )

              return result

          return wrapper

      return decorator

三、高级特性应用

描述符实现

class Validator:

  def __init__(self, validation_func):

      self.validation_func = validation_func

  def __get__(self, instance, owner):

      if instance isNone:

          return self

      return instance.__dict__.get(self.name)

  def __set__(self, instance, value):

      ifnot self.validation_func(value):

          raise ValueError(f"Invalid value for {self.name}")

      instance.__dict__[self.name] = value

  def __set_name__(self, owner, name):

      self.name = name

class Entity:

  name = Validator(lambda x: isinstance(x, str) and len(x) <= 50)

  age = Validator(lambda x: isinstance(x, int) and0 <= x <= 150)

动态属性生成

class DynamicModel:

  def __init__(self, **kwargs):

      for key, value in kwargs.items():

          setattr(self, key, value)

  def __getattr__(self, name):

      if name.startswith('get_'):

          field = name[4:]

          return lambda: getattr(self, field, None)

      raise AttributeError(f"'{self.__class__.__name__}' has no attribute '{name}'")

四、性能优化

方法缓存

class CachedProperty:

  def __init__(self, func):

      self.func = func

      self.name = func.__name__

  def __get__(self, instance, owner):

      if instance isNone:

          return self

      value = self.func(instance)

      setattr(instance, self.name, value)

      return value

class DataProcessor:

  @CachedProperty

  def complex_calculation(self):

      # 复杂计算

      result = sum(i * i for i in range(10000))

      return result

懒加载实现

class LazyAttribute:

  def __init__(self, func):

      self.func = func

      self.name = func.__name__

  def __get__(self, instance, owner):

      if instance isNone:

          return self

      value = self.func(instance)

      setattr(instance, self.name, value)

      return value

class Service:

  @LazyAttribute

  def expensive_resource(self):

      return ExpensiveResource()

五、实践成果

代码优化:

代码量减少60%

重复代码消除

可维护性提升

性能提升:

内存使用减少30%

响应时间提升20%

六、经验总结

设计原则:

DRY (Don't Repeat Yourself)

单一职责

开闭原则

代码即配置

实践建议:

合理使用元编程

注意代码可读性

做好性能监控

保持向后兼容

这次重构不仅优化了代码结构,也加深了对Python元编程特性的理解。记住,元编程是把双刃剑,需要在实际场景中合理使用。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OWTQ29PXszS1JLixHbyRSWwA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券