多种组合可扩展界面功能

问题描述

我有一个定义一些核心API的接口,如下所示:

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 (将#修改为@)