问题描述
class CoreInterface:
def core_func(self):
pass
我还有一些接口可以向核心添加其他API,例如:
class B_Interface(CoreInterface):
def b_func(self,*args):
pass
class C_Interface(CoreInterface):
def c_func_1(self):
pass
def c_func_2(self):
pass
class MyClass(B_Interface,C_Interface):
def core_func(self):
return 'core_func'
def b_func(self,*args):
return 'b_func'
def c_func_1(self):
return 'c_func_1'
def c_func_2(self):
return 'c_func_2'
到目前为止非常简单
现在,我想添加一些带有合成的功能,因为我不想在多重继承中遇到钻石问题。因此,我为B和C接口创建了包装器,如下所示:
class B_Interface_Wrapper:
def __init__(self,obj):
self.obj = obj
def core_func(self):
retval = self.obj.core_func()
modified_retval = self.obj.b_func(retval)
return modified_retval
class C_Interface_Wrapper:
def __init__(self,obj):
self.obj = obj
def core_func(self):
retval = self.obj.core_func()
retval1 = self.obj.c_func_1()
retval2 = self.obj.c_func_2()
return retval,retval1,retval2
单独地,这一切都可以按预期进行。我可以用B包装器或C包装器包装MyClass对象,一切按预期进行。但是,现在我想要一个具有B和C的两个功能的对象,因此我同时包装了两个对象并得到以下错误:
>>> bc_obj = B_Interface_Wrapper(C_Interface_Wrapper(obj))
>>> bc_obj.core_func()
File "test_script.py",line 61,in <module>
bc_obj.core_func()
File "test_script.py",line 25,in core_func
modified_retval = self.obj.b_func(retval)
AttributeError: 'C_Interface_Wrapper' object has no attribute 'b_func'
同样,如果我尝试用其他方式包装它
>>> bc_obj = C_Interface_Wrapper(B_Interface_Wrapper(obj))
>>> bc_obj.core_func()
File "test_script.py",line 62,line 34,in core_func
retval1 = self.obj.c_func_1()
AttributeError: 'B_Interface_Wrapper' object has no attribute 'c_func_1'
我可以理解为什么会发生此错误,但是我对设计挑战感到困惑。我认为有些变通办法有些骇人听闻,所以我想知道我的设计是否存在根本缺陷。使用合成来扩展/修改这样的功能是不好的做法吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)