获取和存储python类的方法

时间:2011-05-12 00:44:57

标签: ironpython

首先,我是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。

1 个答案:

答案 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);