Как получить все имена методов классов в Python - PullRequest
0 голосов
/ 08 января 2020

Я хочу узнать все методы класса класса Something ниже, используя отражение кода. Под всеми методами класса я подразумеваю все методы, которые украшены @classmethod. Я на самом деле не знаю, если это то же самое.

class Something:
    @classmethod
    def a(cls):
        print('a')

    @staticmethod
    def b(cls):
        print('b')

    def c(self):
        print('c')

Так что в этом случае я ожидаю получить список, который содержит только 'a':

get_classmethod_names(Something) == ['a']

1 Ответ

2 голосов
/ 08 января 2020

Это может быть так же просто, как перебирать атрибуты классов и проверять classmethod объекты:

In [1]: class Something:
   ...:     @classmethod
   ...:     def a(cls):
   ...:         print('a')
   ...:
   ...:     @staticmethod
   ...:     def b(cls):
   ...:         print('b')
   ...:
   ...:     def c(self):
   ...:         print('c')
   ...:

In [2]: [attr for attr, obj in vars(Something).items() if isinstance(obj, classmethod)]
Out[2]: ['a']

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

In [3]: class BaseSomething:
   ...:     @classmethod
   ...:     def u(cls):
   ...:         print('u')
   ...:
   ...: class Something(BaseSomething):
   ...:     @classmethod
   ...:     def a(cls):
   ...:         print('a')
   ...:
   ...:     @staticmethod
   ...:     def b(cls):
   ...:         print('b')
   ...:
   ...:     def c(self):
   ...:         print('c')
   ...:

In [4]: Something.mro()
Out[4]: [__main__.Something, __main__.BaseSomething, object]

In [5]: [
   ...:     attr
   ...:     for cls in Something.mro()
   ...:     for attr, obj in vars(cls).items()
   ...:     if isinstance(obj, classmethod)
   ...: ]
Out[5]: ['a', 'u']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...