除非模塊做了一些嚴重的黑客攻擊,否則您可以更換其成員。請注意,所有的參考和分配工作都在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