我有一个“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__
?
答案 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
。