Это обычная проблема привязки - вы хотите раннее связывание для использования i
внутри функции, а Python выполняет позднее связывание для нее. Вы можете принудительно установить более раннюю привязку следующим образом:
class klass(object):
pass
for i in [1,2]:
def f(self, i=i):
print(i)
setattr(klass, 'f' + str(i), f)
или путем переноса f во внешний слой функции, принимая i в качестве аргумента:
class klass(object):
pass
def fmaker(i):
def f(self):
print(i)
return f
for i in [1,2]:
setattr(klass, 'f' + str(i), fmaker(i))