需要将两个python模块中的类组合成一个类

时间:2017-10-27 20:31:47

标签: python python-3.x

我需要将来自两个单独的Python模块(目的相似但具有不同的方法)的类组合成一个类,以便可以在代码和自动文档中以自然的方式从同一对象访问方法代。

我目前正在使用以下代码完成前者而不是后者(这不是逐字的,因为我无法分享我的实际来源,但这里没有什么不同会影响对话)。

基本上,我是通过一个函数创建新类的,该函数结合了两个子类的__dict__属性并返回一个新的类。

def combine(argone, argtwo):
"""
Combine Classes
"""
_combined_arg = "some_string_%s_%s" % argone, argtwo
_temp = type('Temp', (ModuleOne, ModuleTwo), dict())


self = _temp(_combined_arg) # Calling the constructor with our combined arg 
# The two classes have an identical constructor method within their __init__() methods

# Return the object we've instantiated off of the combined class
return self

此方法适用于生成一个对象,该对象允许我从任何一个原始类调用Methods,但我的IDE无法自动完成方法名称,文档生成器(如pdoc)也不能生成任何文档我们的combine()功能。

这个过程是必要的,因为我们正在从其他代码生成代码(描述性,我知道,对不起!)并且将它们组合在上游(即,手动)是不实际的。

有什么想法吗?

提前谢谢!!!

附录:

可以对我们在这里所做的事情的说法是,我们只是将从REST API端点生成的客户端方法组合成恰好分成两个非重叠的命名空间来实现这个讨论并不重要的原因。这就是为什么只需将ModuleTwo中的方法放入ModuleOne就可以了。

如果在运送任何模块之前有关于可自动执行且干净的方式的建议,我绝对愿意听取它们的意见。不必做这项工作将是更可取的。谢谢!

1 个答案:

答案 0 :(得分:0)

每次调用时都不需要combine定义新类。

class CombinedAPI(APIOne, APITwo):
    @classmethod
    def combine(cls, arg_one, arg_two):
        arg = "some_string_%s_%s" % (argone, argtwo)
        return cls(arg)

obj = CombinedAPI.combine(foo, bar)