2016-07-05 89 views
2

我想動態地創建在B類具有相同的名稱和「接口」(與該方法我的意思是ARGS/kwargs /默認列表)作爲A類中的方法,但代碼不同。如何動態更改功能界面,例如F() - > F(A,B,C =「默認」)

如F通用接口(*指定參數時,** kwargs)是不可取的。

生成的方法,並且用類似SETATTR(個體經營.__ class__,發.__ name__,FB),複印文檔字符串等動態加入他們,是很容易的。但我找不到動態複製'接口'的方法。寫訪問fb .__代碼__。co_argcount /.co_varnames不起作用。

我發現這是動態創建一個字符串的方法,然後將它們連接到類,像最近的解決方案:

code = '''def f(a,b): ...''' 
ns = {} 
exec code in ns 
setattr(self.__class__, 'f', ns['f']) 

但我不喜歡這樣的做法,並會更喜歡生成從我的方法通過動態改變其接口的通用方法。 (檢查,並使用該接口從內部的方法是不是一個問題。)

任何方式做到這一點? (用例:B類中的方法通過zeroMQ消息傳遞,在類A中調用它們的'mirror'方法,它們在不同的進程中運行,然後返回結果,提供本地'mirror'接口。因爲可能有大量不同的'遠程'類A1..An,我不想創建和維護所有相應的類B1..Bn手動,但有一個泛型類B,它將適應本身自動任一類別斧傳遞給它。)

我的第一篇文章,希望這是相當清楚... THX!

+0

你打算如何動態生成實際的函數體?無論如何,你必須使用'compile'或者其他的東西來做,所以爲什麼不使用它來定義簽名呢? – BrenBarn

+0

我希望能夠:(1)聲明一個通用函數,它檢查並處理自己的簽名,然後(2)創建它的副本並修改它們的名稱和簽名以匹配類A – BigT

+0

中的那些...也可以像創建他們: '高清makeFn(CLS,fnName,** signatureInfo): 高清newFn(個體經營):基於自我檢查和/或 ** signatureInfo SETATTR作用 #通用代碼(CLS, fnName,newFn)' 但是這仍然給我帶來了改變新功能簽名的問題 – BigT

回答

0

一旦創建它不能修改一個函數的簽名。你必須按照你的描述去做。對於你來說,decorator庫的來源可能是有用的,因爲它包含了一個用於給定簽名的函數的機制。

+0

應該這樣做。謝謝! – BigT

相關問題