首先,我是python的新手,在.NET上有点生疏,所以如果听起来那么请耐心等待 太明显了。 假设有以下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
}
}
我想要做的是在稍后创建的实例上调用func(类型为IronPython.Runtime.Method)。从我从IronPython源码中收集的内容来看,实例在创建时就已经完成了,我无法改变它。有没有办法实现这一目标?我也不确定在什么上下文(范围??)中运行该函数或者我不应该担心这一切。
ObjectOperations有一个名为MemberInvoke的方法,它接受一个对象和成员名称,但我更喜欢MethodInfo.Invoke类型的调用,以用于样式和性能方面的考虑。
任何指针都会非常感激。
P.S。我顺便使用IronPython 2.7和.Net4.0。
答案 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);