ironpython: есть ли способ отличить мои методы от унаследованных методов в c # определенном классе? - PullRequest
2 голосов
/ 20 сентября 2011

Я определил класс с одной функцией.Например:

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']

Я хочу знать, какой метод инстроспекции мне нужно использовать, чтобы получить список только функций, уникальных для этого класса.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

У вас есть несколько вариантов.

Вы можете (явно) реализовать интерфейс 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)
1 голос
/ 20 сентября 2011

У меня нет удобного интерпретатора IronPython, чтобы проверить, работает ли он с классами .NET, но вы можете использовать:

print instance.__class__.__dict__

чтобы получить членов, которые являются частью этого класса. Будут добавлены некоторые дополнительные методы Python __foo__ (например, __doc__), которые добавляет IronPython, но их легко отфильтровать.

...