我已经定义了一个具有单个函数的类。例如:
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方法来获取这个类唯一的函数列表。
答案 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)