Как получить имя пользовательского метода? - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь получить все определяемые пользователем имена методов из класса, например:

class MyClass:
    def __init__(self, param1, param2):
        pass

    def one_method(self):
        pass

    def __repr__(self):
        pass

    def __str__(self):
        pass

    def __my_method_no_2(self, param2):
        pass

    def _my_method_no_3(self):
        pass

До сих пор я пришел к следующему подходу:

import inspect 

[name for name, _ in inspect.getmembers(MyClass, inspect.isroutine)
 if name not in {'__init_subclass__', '__subclasshook__'} and 
 getattr(MyClass, name).__qualname__.startswith(MyClass.__name__)]

вывод:

['_MyClass__my_method_no_2',
 '__init__',
 '__repr__',
 '__str__',
 '_my_method_no_3',
 'one_method']

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

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Получил идею из здесь , но с использованием __dict__ вместо dir.

Каждый python объект имеет атрибут __dict__, содержащий имена всех атрибутов. Соответствующие документы здесь

Идея такова: получить список атрибутов из __dict__ и отфильтровать все, что нельзя вызвать

[attr for attr in  MyClass.__dict__ if callable(getattr(MyClass, attr))]

Соответствует вашему выводу

2 голосов
/ 11 апреля 2020

В Python 3.x вы можете использовать dir без inspect или любых внешних библиотек:

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func))]

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

class MyClass:
    li = []
    def __init__(self, param1, param2):
        pass

    def one_method(self):
        pass

    def __repr__(self):
        pass

    def __str__(self):
        pass

    def __my_method_no_2(self, param2):
        pass

    def _my_method_no_3(self):
        pass


print([func for func in dir(MyClass) if callable(getattr(MyClass, func)) and func in MyClass.__dict__])

Выходы:

['_MyClass__my_method_no_2', '__init__', '__repr__', '__str__', '_my_method_no_3', 'one_method']


...