我正在使用我导入的模块中的类。我想扩展这个类:添加更多的属性/方法。但是,我想保留原始类的所有功能,包括所有可能的构造函数。
这是我可以做到的一种方法:
class Extension(module.ModuleClass):
def __init__(self, *args, **kwargs):
newargument = kwargs.pop("myarg")
super(Extension, self).__init__(*args, **kwargs)
self.newargument = newargument
这似乎可行,但有一个小的语法糖问题和以下更大的问题。 ModuleClass 重载了“+
”等运算符。当然,Extension 现在受益于这种重载,但由于这些在 ModuleClass 中的实现方式,结果是 ModuleClass 类型,而不是 Extension。也就是说,对于 Extension
对象 a
和 b
,结果 a + b
定义明确,但具有类型ModuleClass
,不是Extension
。这非常重要..
是否有更好的方法来实现扩展,例如我正在寻找的?作为操作的结果,在类型保留的意义上更好,更容易调试,更容易维护,更高效?
具体来说,有没有办法使用组合而不是继承?即,编写一个具有作为属性 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)
最佳答案
像这样的东西会起作用
class Extension(module.ModuleClass):
def __init__(self,*args, myarg=None, **kwargs):
if myarg is None:
raise ValueError('myarg is required')
super(Extension, self).__init__(*args, **kwargs)
self.newargument = myarg
关于python - 我想修饰 python 模块中的一个类。我该怎么做呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082440/