2016-07-05 86 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

相关问题