扩展黑盒python模块

时间:2016-10-03 13:37:59

标签: python python-2.7 cython

我有一个“blackbox”python模块,我想扩展它。该模块提供了一个没有class Foo函数的类__init__,以及一个返回FooMaker类型对象的辅助函数Foo。扩展模块的通常策略:

class ExtendedFoo(blackbox.Foo):
    def __init__(self, x):
        super(ExtendedFoo, self).__init__(x)

在这里不起作用,因为如上所述,我需要依靠blackbox.FooMaker而不是Foo的{​​{1}}函数。

有关如何扩展模块的任何想法__init__

3 个答案:

答案 0 :(得分:1)

这应该与您的解决方案相同,但稍微缩短一点:

from blackbox import Foo, FooMaker

class ExtendedFoo(Foo):

    def __init__(self, *args, **kwargs):
        self.set(FooMaker(*args, **kwargs).get())

答案 1 :(得分:0)

事实证明Foo类有一个setter函数,所以最终对我有用的是

class ExtendedFoo(blackbox.Foo):
    pass

def ExtendedFooMaker(*args):
    _efoo = ExtendedFoo()
    _efoo.set(FooMaker(*args).get())
    return _efoo

答案 2 :(得分:-1)

答案是在澄清模块是用Cython编写的,而不是Python编写的。以下仅适用于Python模块。

除非模块做了一些严重的黑客行为,否则你可以更换其成员。请注意,所有引用和赋值都适用于blackbox.名称,而不是本地名称!

如果你想要你的新班级' __init__要在FooMaker内投放,只需继承并替换Foo

import blackbox
class ExtendedFoo(blackbox.Foo):
    def __init__(self, x):
        super(ExtendedFoo, self).__init__(x)

blackbox.Foo = ExtendedFoo

这样,FooMaker将仅实例化ExtendedFoo的类。

或者,您可以将FooMaker替换为您自己的版本。

import blackbox
_bbfoomaker = blackbox.FooMaker  # keep reference so we can use it later
def SuperFooMaker(*fooargs, **fookwargs):
    new_instance = _bbfoomaker(*fooargs, **fookwargs)
    new_instance.whitebox = True  # or whatever

blackbox.FooMaker = SuperFooMaker

对第二个模块的限制是,如果另一个模块执行from blackbox import FooMaker之类的操作,则必须先运行/导入模块 。否则,另一个模块仍会看到原始工厂,类似于您仍然拥有_bbfoomaker