Вы не указали MCVE в своем вопросе. поэтому я сделал что-то работоспособное, чтобы проиллюстрировать, как вы можете это сделать (хотя я думаю, что у @Ned Batchelder, вероятно, есть лучшее предложение).
Обратите внимание, это также показывает, что я считаю лучшим способом встраивания исходного кода функций.
from textwrap import dedent
class InputParameter: # Mock for testing
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
class Class:
def __init__(self):
self.InputParameters = [ # For testing
InputParameter(Order=42, Name='@foobar'),
]
def _addprop(self, name, getter, setter):
print('_addprop({!r}, {}, {})'.format(name, getter, setter))
def _injectProperties(self):
"""docstring"""
for p in self.InputParameters:
index = p.Order
name = p.Name.lstrip('@')
pName = p.Name
fnGet = dedent("""
def get(self):
rtnVal = [p.Value for p in self.InputParameters
if p.Name == '{0}'][0]
return rtnVal
""").format(p.Name)
fnSet = dedent("""
def set(self, value):
prop = [p for p in self.InputParameters
if p.Name == '{0}'][0]
prop.Value = value
return
""").format(p.Name)
locals_dict = {}
exec(fnGet, globals(), locals_dict)
exec(fnSet, globals(), locals_dict)
self._addprop(name, locals_dict['get'], locals_dict['set'])
return
cls = Class()
cls._injectProperties()
Выход:
_addprop('foobar', <function get at 0x00270858>, <function set at 0x00572C00>)