class MyClass:
def __init__(self):
self.methods = []
for name in dir(self):
attr = getattr(self, name)
if callable(attr) and not name.startswith("__"):
self.methods.append(attr)
def print_hello(self):
print("Hello!")
test = MyClass()
test.methods[0]()
UPDATE
Доработанный вариант:
class MyClass:
def __init__(self):
"""Тут не должно быть много логики"""
self.my_attr = 'my attribute'
@property
def methods(self):
"""Динамическое получение списка методов
Зачем так?
1) мы убрали логику из __init__
2) узнаем о методе, даже если добавили его потом с помощью setattr
"""
result = []
for name in dir(self):
# добавлена проверка name != 'methods',
# чтобы избежать бесконечной рекурсии
if name != 'methods' and not name.startswith("__"):
attr = getattr(self, name)
if callable(attr):
result.append(attr)
return result
@property
def my_property(self):
"""это property, а не метод"""
pass
def my_method_1(self):
"""а вот это метод"""
print("my method 1")
def my_method_2(self):
"""и это не метод"""
print("my method 2")
test = MyClass()
print('Всего методов:', len(test.methods))
for method in test.methods:
method()
# Получим в выводе две строки:
# Всего методов: 2
# my function 1
# my function 2