@VuztreeCalan
Дилетант Широкого Профиля

Как преобразовать список с именами методов в список методов в Python3?

Нужно получить список состоящий из всех методов класса, использую для этого dir, но он на выходе выдаёт список состоящий из строк, приведу сразу псевдокод чтобы было понятнее что я хотел сделать:
class MyClass():
    def __init__(self):
        self.methods = [func for func in dir(self) if callable(getattr(self,func)) and not func.startswith("__")]

    def print_hello(self):
        print("Hello!")

test = MyClass()
test.methods[0]()  # Не работает т.к. в списке только строки
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
ri_gilfanov
@ri_gilfanov
Web- and desktop-developer
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
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@antonksa
Как вам уже сказали выше напишите вместо
func for func in dir(self)
вот так
attr_name for attr_name in dir(self)
и сразу поймете почему у вас так вышло.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы