You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将私有属性传入工具函数违反封装,求替代解决方案

解决合并逻辑的封装问题

我有3个类,它们的merge操作执行相同逻辑但参数不同,当前实现的框架代码如下:

class FirstClass:
  def __init__(self):
    # 构造函数定义

  def merge(self, other):
    # 将other合并到self中
    merge_util(src=other, dest=self)

class SecondClass:
  def __init__(self):
    # 构造函数定义

  def merge(self, other):
    # 将other合并到self中
    merge_util(src=other, dest=self)

# ThirdClass定义方式完全相同

merge_util的定义如下:

def merge_util(src, dest):
  # 将src的私有属性(一个数组、列表和数据库表)合并到dest中

当前设计存在违反封装的问题:外部函数merge_util正在直接访问类的私有/受保护属性。

我已考虑两种解决方案:

  • 在每个类中定义merge_util方法,但会导致代码重复。
  • 使用继承,但这些类除此之外几乎没有相似性,因此从一开始就未使用继承,且希望避免这种方式。

其他可行方案

1. 提供受控的属性访问接口

让每个类公开专门的方法,返回需要合并的私有属性集合,merge_util仅通过这些公开接口获取数据,不再直接操作类的内部私有属性。

示例代码:

class FirstClass:
    def __init__(self):
        self._private_array = []
        self._private_list = []
        self._private_table = None

    def get_mergeable_data(self):
        return {
            'array': self._private_array,
            'list': self._private_list,
            'table': self._private_table
        }

    def merge(self, other):
        merge_util(src=other, dest=self)

# SecondClass和ThirdClass同样实现get_mergeable_data方法

def merge_util(src, dest):
    src_data = src.get_mergeable_data()
    dest_data = dest.get_mergeable_data()
    # 执行合并逻辑
    dest_data['array'].extend(src_data['array'])
    dest_data['list'].extend(src_data['list'])
    # 数据库表的合并逻辑...

2. 使用Mixin混入类

创建一个仅包含合并逻辑的Mixin类,让三个业务类继承该Mixin。Mixin的作用是复用特定功能,不会强制类之间产生不必要的层级关系,完美适配“仅合并逻辑相同”的场景。

示例代码:

class MergeMixin:
    def _get_mergeable_data(self):
        # 子类必须实现该方法,返回自身的可合并数据
        raise NotImplementedError("子类必须实现_get_mergeable_data方法")

    def merge(self, other):
        src_data = other._get_mergeable_data()
        dest_data = self._get_mergeable_data()
        # 执行合并逻辑
        dest_data['array'].extend(src_data['array'])
        dest_data['list'].extend(src_data['list'])
        # 数据库表合并逻辑...

class FirstClass(MergeMixin):
    def __init__(self):
        self._private_array = []
        self._private_list = []
        self._private_table = None

    def _get_mergeable_data(self):
        return {
            'array': self._private_array,
            'list': self._private_list,
            'table': self._private_table
        }

# SecondClass和ThirdClass同样继承MergeMixin并实现_get_mergeable_data

3. 使用装饰器注入合并方法

通过装饰器为每个类动态添加merge方法,同时要求类实现获取合并数据的接口。这种方式既复用了合并逻辑,又保持了类的独立性,不需要修改类的继承结构。

示例代码:

def add_merge_method(cls):
    def merge(self, other):
        src_data = other.get_mergeable_data()
        dest_data = self.get_mergeable_data()
        # 执行合并逻辑
        dest_data['array'].extend(src_data['array'])
        dest_data['list'].extend(src_data['list'])
        # 数据库表合并逻辑...
    cls.merge = merge
    return cls

@add_merge_method
class FirstClass:
    def __init__(self):
        self._private_array = []
        self._private_list = []
        self._private_table = None

    def get_mergeable_data(self):
        return {
            'array': self._private_array,
            'list': self._private_list,
            'table': self._private_table
        }

# SecondClass和ThirdClass同样用@add_merge_method装饰并实现get_mergeable_data

内容的提问来源于stack exchange,提问作者roulette01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:05:12