Найти - Пользователи
Полная версия: Динамическое создание методов класса в цикле.
Начало » Python для новичков » Динамическое создание методов класса в цикле.
1
Vort
Доброго времени суток.

Допускаю, что по не незнанию пытаюсь решить проблему не с той стороны

Возникла задача, по созданию динамического количества методов класса

 def add_dynamics(cls):
    cur = DbProvider.get_cursor(dict_cursor=True)
    cur.execute("""SELECT COLUMN_NAME
                 FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_SCHEMA = 'my_db_name' AND TABLE_NAME = 'synchro_session';""")
    res = cur.fetchall()
    column_names = [c['COLUMN_NAME'] for c in res]
    def fieldmethod(self):
        cur = DbProvider.get_cursor(dict_cursor=True)
        cmd = "SELECT `{}` FROM `synchro_session` WHERE `city`='{}';".format(fieldmethod.__name__, self.office_id)
        cur.execute(cmd)
        return cur.fetchone()[fieldmethod.__name__]
    
    for name in column_names:   # создаю методы и аттачу к классу
        f = fieldmethod
        f.__doc__ = "docstring for {}".format(name)
        f.__name__ = name
        setattr(cls, f.__name__, f)
class SynchroSession(object):
    def __init__(self, office_id):
        add_dynamics(SynchroSession)

Но обнаружил, что по адресу в памяти все добавленные методы фактически являются одним и тем же объектом и в итоге значение естественно записывается только с последней итерации.

Как правильно организовать такое, чтобы это были действительно независимые функции-методы, каждый со своим именем и адресом в памяти?
Заранее спасибо за любые советы.
FishHook
Сделайте функцию, которая возвращает другую функцию, тогда результат функции каждый раз будет новая функция. Вызывайте эту функцию в цикле.
Vort
FishHook
Сделайте функцию, которая возвращает другую функцию, тогда результат функции каждый раз будет новая функция. Вызывайте эту функцию в цикле.
Большое спасибо, получилось именно то, что хотел.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB