2011-05-12 62 views
1

首先,我是python新手,在.NET上有点生疏,所以如果听起来 太明显,那么请耐心等待。 假设下面的python类;获取和存储python类的方法

class foo1(object): 
     def bar1(self): 
     print "bar1 called." 
     def bar2(self): 
     print "bar2 called." 
class foo2 ..... same as above 

我想不想找个存储类方法,并希望调用它们我自己的选择。这的对象是什么,我想出了。

ObjectOperations ops = engine.Operations; 
IList<string> members = ops.GetMemberNames(scope); 
foreach(string member in members) 
{ 
    if(member.StartsWith("foo")) 
     { 
     dynamic klass= scope.GetVariable(member); 
     dynamic instance= klass(); 
     //for brevity I am skipping the enumeration of 
     //function names here. 
     dynamic func = ops.GetMember(instance, "bar1");//and store it somewhere 
     Action act = ops.ConvertTo<Action>(func); //This part is not really necessary 

     } 
} 

我想要做的就是在一个实例创建晚些时候调用(类型IronPython.Runtime.Method的)的FUNC什么。从我从IronPython收集的资料中可以看出,实例在创建时被设置为石头,而且我无法更改它。是否有办法实现此目的?我也不确定在什么情况下(范围??)运行该功能,或者我不应该担心这一切。

ObjectOperations确实有一个名为MemberInvoke的方法,它接受一个对象和成员名称,但我宁愿使用MethodInfo.Invoke类型的调用来兼顾样式和性能方面的考虑。

任何指针将不胜感激。

P.S.我正在使用IronPython 2.7和.Net4.0 ..

回答

3

是的,这其实很简单。在Python方法可以被调用为约束的方法,如:

x = C().f # produces a bound method 
x() # invokes the bound method 

这是一样的:

C().f() 

或者,他们可以有明确的自我参数来调用:

C.f(C()) 

这与托管API的工作方式相同,因此您只需执行以下操作:

dynamic klass = scope.GetVariable(member); 
dynamic func = ops.GetMember(klass, "bar1"); 

// and then later: 
func(inst); 
+0

这很容易。我以为我需要事先创建一个实例。谢谢 – 2011-05-12 13:32:35