Задать вопрос

Python как создать метод для метода динамически?

Приветствую.
Подскажите вариант динамического создания методов для методов и для метода, .... :)
Создаю класс который будет обрабатывать несуществующий метод, возвращая название метода и переданные ему аргументы:
class A():
    def __getattr__(self, m):
        def wrap(*args):
            if not args: args = ""
            return "%s %s" % (m, " ".join(args))
        return wrap

Т.е.
>>> a = A():
>>> a.method(1,2,3)
method 1 2 3
>>> a.ufo('is', 'not', 'true')
ufo is not true

Для реализации дополнительного метода, вида:
>>> a.method(1,2,3).submethod('ufo', 'is', 'not', 'true')

можно написать так:
class A():
    def __getattr__(self, m):
        def wrap(*args):
            if not args: args = ""
            return _A("%s %s" % (m, " ".join(args)))
        return wrap


class _A():
    def __init__(self, s):
        self.s = s
    def __getattr__(self, m):
        def wrap(*args):
            if not args: args = ""
            else:
                w = " %s %s" % (m, " ".join(args))
            return self.s + w
        return wrap

Недавно я столкнулся с peewee и там, как положено ORM, подобных методов может быть много:
Entry.select().join().where().order_by()
Решил посмотреть в исходниках как это реализовано. Там же все методы обрабатываются рекурсивно, в общем подобное реализовать не получилось, немного мозги даже закипели.
Может кто подскажет простой вариант реализации рекурсивной обработки методов.
  • Вопрос задан
  • 1674 просмотра
Подписаться 3 Комментировать