我想从python模块中润色一个类。我该怎么做?

2024-10-01 07:46:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是我导入的模块中的类。我想扩展这个类:添加更多的属性/方法。但是,我希望保留原始类的所有功能,包括所有可能的构造函数。你知道吗

我有一个办法:

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对象ab,结果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)

Tags: 方法nameself类型参数属性initdef
2条回答

您可以向Extension.__init__添加所需的参数,如下所示:

class Extension(module.ModuleClass):
    def __init__(self, myarg, *args, **kwargs):
        super(Extension, self).__init__(*args, **kwargs)
        self.newargument = myarg

像这样的办法行得通

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

相关问题 更多 >