Приветствую.
Подскажите вариант динамического создания методов для методов и для метода, .... :)
Создаю класс который будет обрабатывать несуществующий метод, возвращая название метода и переданные ему аргументы:
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()
Решил посмотреть в исходниках как это реализовано. Там же все методы обрабатываются рекурсивно, в общем подобное реализовать не получилось, немного мозги даже закипели.
Может кто подскажет простой вариант реализации рекурсивной обработки методов.