Получить список методов класса внутри C-Python - PullRequest
0 голосов
/ 30 августа 2018

Допустим, у меня есть класс, определенный в Python следующим образом

class A(object):
    def __init__(self):
        pass
    def rockabye(self):
        pass

class B(A):
    def __init__(self):
        pass
    def iamOnlyinB(self):
        pass

Я пытаюсь получить список функций, которые существуют только в B и не унаследованы от A или object.

PyTypeObject* l_typeObject = <a function out of scope of the question>

for (int i = 0; true; i++)
    {
        PyMethodDef method_def = l_typeObject->tp_methods[i];
        if(method_def.ml_name == NULL)
            break;
        std::cout << method_def.ml_name <<std::endl;

    }

Я всегда нахожу l_typeObject->tp_methods это NULL. Зачем ? и каковы возможные альтернативные подходы?

1 Ответ

0 голосов
/ 30 августа 2018

tp_methods:

Необязательный указатель на статический массив с окончанием NULL из PyMethodDef структур, объявляющий обычные методы этого типа.

Для каждой записи в массиве запись добавляется в словарь типа (см. tp_dict ниже), содержащий дескриптор метода.

Это поле не наследуется подтипами (методы наследуются через другой механизм).

Другими словами, это встроенные методы, прикрепленные к классу модулем расширения, который его создал.

Для класса, построенного на Python, нет встроенных методов, и нет модуля расширения, который его создал, поэтому он всегда будет либо NULL, либо пустым.


То, что вы хотите сделать, это то же самое, что вы делаете в Python:

  • Либо посмотрите в диктовку класса (к которой вы можете получить доступ через tp_dict), либо
  • Вызовите метод, например dir или inspect.getmembers (так же, как вы вызываете любой другой код Python).

Конечно, вы получаете все атрибуты класса (в зависимости от того, что вы делаете, также, возможно, все унаследованные атрибуты), так что если вам нужны только методы , вам нужно отфильтровать его. Но вы делаете это так же, как и в Python.

Поскольку «метод» является своего рода двусмысленным термином (должен ли он включать методы класса и статические методы? Как насчет оболочек, которые действуют как функции, когда связаны как методы, но не являются функциями? с тем правилом, которое вы хотите отфильтровать, и примените его так же, как с Python. (Некоторые вещи, такие как PyCallable_Check, имеют специальную поддержку C API; во всем остальном вы будете выполнять проверку подкласса или вызывать функцию Python.)

...