扩展黑盒python modu

2024-04-26 22:21:22 发布

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

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

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

在这里不起作用,因为如上所述,我需要依赖blackbox.FooMaker而不是Foo__init__函数。你知道吗

关于如何扩展模块blackbox有什么想法吗?你知道吗


Tags: 模块对象函数self类型fooinitdef
3条回答

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

from blackbox import Foo, FooMaker

class ExtendedFoo(Foo):

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

原来Foo类有一个setter函数,所以最终对我起作用的是

class ExtendedFoo(blackbox.Foo):
    pass

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

答案是在澄清之前写的,模块是用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。你知道吗

相关问题 更多 >