我使用的是我导入的模块中的类。我想扩展这个类:添加更多的属性/方法。但是,我希望保留原始类的所有功能,包括所有可能的构造函数。你知道吗
我有一个办法:
class Extension(module.ModuleClass):
def __init__(self, *args, **kwargs):
newargument = kwargs.pop("myarg")
super(Extension, self).__init__(*args, **kwargs)
self.newargument = newargument
这似乎是可行的,但有一个小的语法糖问题和下面更大的问题。ModuleClass重载“+
”等运算符。当然,扩展现在受益于这种重载,但是由于这些重载是如何在ModuleClass中实现的,因此结果是ModuleClass类型的,而不是扩展类型的。也就是说,对于Extension
对象a
和b
,结果a + b
定义良好,但具有类型ModuleClass
,而不是Extension
。这是非常重要的。。你知道吗
有没有更好的方法来实现扩展,如我所寻找的?从操作的结果来看,类型保留的意义更好,更容易调试,更容易维护,更高效?你知道吗
具体来说,有没有一种使用组合而不是继承的方法?也就是说,要编写一个具有as属性的ModuleClass
包装类,它能够将所有属性(包括方法)重定向到包含的ModuleClass
,但处理与新参数等相关的功能本身?你知道吗
以下是我尝试使用合成来解决问题的失败案例:
class Extension(object):
def __init__(self, *args, **kwargs):
self.myarg = kwargs.pop('timestamp')
self.mclass = module.ModuleClass(*args, **kwargs)
def __getattribute__(self, name):
if (name == 'mclass'):
return self.mclass
elif (name == 'myarg'):
return self.myarg
else:
return getattr(self.mclass, name)
但这并没有达到我想要的效果(通过扩展使Extension
看起来像Module
)。要注意什么?你知道吗
次要的语法问题:构造函数参数现在必须包含“myarg=something”,这不是最理想的。(如果我可以让构造函数接受第一个参数,或者使用“myarg=something”指定的参数进行初始化,我会更愿意这样做self.newargument参数. 不过,这是个小问题。理想情况下,我希望支持窗体的构造函数调用
Extension(validValueForMyarg, validStuffToInitModuleClass)
Extension(validStuffToInitModuleClass, myarg = validValueForMyarg)
在有意义的地方
Extension(myarg = validValueForMyarg, validStuffToInitModuleClass)
您可以向
Extension.__init__
添加所需的参数,如下所示:像这样的办法行得通
相关问题 更多 >
编程相关推荐