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
(я знаю, это не большой код, но он понимает через). До установки docstring я знаю, что это возможно, но я должен был бы искать его в документации.
Редактирование : можно установить docstring через dynamo.__doc__
, таким образом, Вы могли сделать что-то вроде этого в своем теле цикла:
dynamo.__doc__ = "Adds %s to the weight" % i
Другое Редактирование : Со справкой от @eliben и @bobince, должна быть решена проблема закрытия.
You could do it with generics:
public <T extends Appendable & Closeable> void spew(T t){
t.append("Bleah!\n");
if (timeToClose())
t.close();
}
Your syntax was almost right, actually.