Это может быть так же просто, как перебирать атрибуты классов и проверять 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']