除非模块做了一些严重的黑客攻击,否则您可以更换其成员。请注意,所有的参考和分配工作都在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
。
在init中调用FooMaker? – idjaw
使用组合而不是专门化 –
您是否希望您的'__init__'在FooMaker执行任何初始化任务之前或之后运行? – MisterMiyagi