ironpython:在c#定义的类中,有什么办法可以区分我的方法和继承的方法吗?

时间:2011-09-19 21:28:10

标签: c# ironpython

我已经定义了一个具有单个函数的类。例如:

namespace my.namespace
{
    public class MyClass
    {
        public void some_func(string s1, string s2)
        {
            // more code here               
        }       
    }
}

我可以将此对象加载到ironpython解释器中。我想使用内省来获取仅在此类中实现的方法列表。在这个例子中,我想要一个像['some_func']这样的列表。有办法吗?

如果我在这个实例上做help(instance),我或多或少会得到我想要的东西:

class MyClass(object)
 |  MyClass()
 |  
 |  Methods defined here:
 |  
 |  __repr__(...)
 |      __repr__(self: object) -> str
 |  
 |  some_func(...)
 |      some_func(self: MyClass, s1: str, s2: str)

当然,当我dir(instance)时,我会得到许多其他功能:

>>> dir(instance)
['Equals', 'GetHashCode', 'GetType', 'MemberwiseClone', 'ReferenceEquals', 'ToString', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'some_func']

我想知道我需要使用什么样的instrospection方法来获取这个类唯一的函数列表。

2 个答案:

答案 0 :(得分:1)

我没有使用IronPython解释器来检查它是否适用于.NET类,但您可以使用:

print instance.__class__.__dict__

获取仅属于该类的成员。将会有一些额外的Python __foo__方法(如__doc__)IronPython添加但这些方法很容易过滤掉。

答案 1 :(得分:1)

您有很多选择。

您可以(明确地)实现IronPython.Runtime.IPythonMembersList接口,以便列出您要列出的任何成员。就像为您的班级定义__dir__方法一样。

public class MyClass : IronPython.Runtime.IPythonMembersList
{
    public void some_func(string s1, string s2) { }

    IList<object> IronPython.Runtime.IPythonMembersList.GetMemberNames(CodeContext context)
    {
        return new[] { "some_func" };
    }

    IList<string> Microsoft.Scripting.Runtime.IMembersList.GetMemberNames()
    {
        return new[] { "some_func" };
    }
}

您也可以随时为您的班级定义公共__dir__方法。返回类型可能是真的,但你可能想要返回一些字符串集合。

public class MyClass
{
    public void some_func(string s1, string s2) { }

    public IEnumerable<string> __dir__()
    {
        return new[] { "some_func" };
    }
}

您始终可以选择使用常规的.NET反射。

from System.Reflection import BindingFlags

# you can omit the flags if you want all public .NET members
flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly

members = instance.GetType().GetMembers(flags)
dir_members = [ mi.Name for mi in members ]
print(dir_members)