将私有属性传入工具函数违反封装,求替代解决方案
解决合并逻辑的封装问题
我有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
相关产品推荐
相关产品推荐

