Python позволяет вам объявлять функцию в функции, поэтому вам не нужно делать exec
хитрость.
def __init__(self):
def dynamo(self, arg):
""" dynamo's a dynamic method!
"""
self.weight += 1
return arg * self.weight
self.weight = 50
setattr(self.__class__, 'dynamo', dynamo)
Если вы хотите иметь несколько версий функции, вы можете поместить все это в цикл и изменить то, что вы называете их в функции setattr
:
def __init__(self):
for i in range(0,10):
def dynamo(self, arg, i=i):
""" dynamo's a dynamic method!
"""
self.weight += i
return arg * self.weight
setattr(self.__class__, 'dynamo_'+i, dynamo)
self.weight = 50
(я знаю, что это не очень хороший код, но в нем есть смысл). Что касается настройки строки документации, я знаю, что это возможно, но мне придется искать это в документации.
Редактировать : Вы можете установить строку документации с помощью dynamo.__doc__
, чтобы вы могли сделать что-то подобное в теле вашего цикла:
dynamo.__doc__ = "Adds %s to the weight" % i
Другое редактирование : С помощью @eliben и @bobince, проблема закрытия должна быть решена.