python - 我想修饰 python 模块中的一个类。我该怎么做呢?

标签 python

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

这是我可以做到的一种方法:

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

相关文章:

Python - 按类别从第一行获取开始日期和从最后一行获取结束日期

python - 在数据库中已有数据之后添加的 UUID 字段。有没有办法为现有数据填充 UUID 字段?

python - psycopg2 共享内存不足并提示增加 max_pred_locks_per_transaction

java - 使用 Google App Engine 的网络服务

python - 如何过滤 Pandas 中的列?

python - 在seaborn中用中值标记箱线图

如果创建,Python 子进程 stderr/stdout 字段为 None

Python 产生多重赋值

python - 我如何找出在哪个文件或模块中调用了我的函数?

python - Flask-Login 让我登录,但每当我发出 GET 请求时,立即再次让我注销