2013-07-24 28 views
2

我有一個生成類的類工廠F.它除了名字之外不需要其他參數。我希望能夠換這個方法,使用它像這樣:我可以建立一個自動類工廠,對導入工作嗎?

from myproject.myfactory.virtualmodule import Foo 

「myfactory」是項目真正的模塊,但我想virtualmodule要的東西僞裝成一個模塊。

每當我從virtualmodule導入某些東西時,我希望它使用我的工廠方法構建一個新類,並使其看起來好像是導入的。

可以這樣做嗎?有沒有一種模式可以讓我將一個類工廠作爲一個模塊來包裝?

謝謝!

-

UPDATE0:爲什麼我需要這個?它實際上是測試一個將在網格上運行的進程,它要求所有的類都應該是可導入的。

自動生成的類的一個實例將在我的PC上序列化,然後在每個網格節點上反序列化。如果該類無法在網格節點上導入,則反序列化將失敗。

如果我劫持導入機制作爲製作我的測試類的接口,那麼我知道我可以在PC上導入的任何東西都可以在網格上重新創建。這將滿足我的測試要求。

+1

'Foo = myproject.myfactory.createClass(「Foo」)''有什麼問題?你想從模塊雜技中獲得什麼? –

+0

我已經添加了一個作爲我的問題的更新。 –

+0

一個例子會很棒! –

回答

3

可以東西的任意對象到sys.modules結構:

import sys 

class VirtualModule(object): 
    def __init__(self, name): 
     self.__name__ = name.rsplit('.', 1)[-1] 
     self.__package__ = name 
     self.__loader__ = None 

    def __getattr__(self, name): 
     if name is valid: 
      # Return dynamic classes here 
      return VirtualClass(name) 

     raise AttributeError(name) 


virtual_module_name = 'myproject.myfactory.virtualmodule' 
sys.modules[virtual_module_name] = VirtualModule(virtual_module_name) 

Python的進口機械將使用屬性訪問,觸發你的VirtualModule實例__getattr__方法查找對象。

myproject/__init__.pymyproject/myfactory/__init__.py文件中執行此操作,您即將開始工作。 myproject.myfactory包確實需要爲導入機器找到myproject.myfactory.virtualmodule對象。

相關問題