Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2016 14:22:55

Vort
Зарегистрирован: 2014-01-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое создание методов класса в цикле.

Доброго времени суток.

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

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

 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)

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

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

Отредактировано Vort (Окт. 21, 2016 15:03:51)

Офлайн

#2 Окт. 21, 2016 14:44:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Динамическое создание методов класса в цикле.

Сделайте функцию, которая возвращает другую функцию, тогда результат функции каждый раз будет новая функция. Вызывайте эту функцию в цикле.



Офлайн

#3 Окт. 21, 2016 15:08:14

Vort
Зарегистрирован: 2014-01-09
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое создание методов класса в цикле.

FishHook
Сделайте функцию, которая возвращает другую функцию, тогда результат функции каждый раз будет новая функция. Вызывайте эту функцию в цикле.
Большое спасибо, получилось именно то, что хотел.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version