2015-03-10 3 views
0

У меня есть класс, предназначенный для работы с PostGreSQL дб:питон __setattr__ приписывать проблемы

dbclass = DBclass(1) 
class DBclass(object): 
    select_query = 'SELECT * FROM "{table}" WHERE {table}_id=%s' 

    def __init__(self, id=None): 
      self.__id  = id 
      self.__table = self.__class__.__name__.lower() 

И я __setattr__ перегружен:

def __setattr__(self, name, value): 
    super(DBclass, self).__setattr__(name, value) 
    self.load() 

И метод, используемый для подключения для загрузки содержимого из БД:

def load(self): 
    # Here I send select query and get two remaining values 

С этим __setattr__ Я могу инициализировать только __id и __table значения. Есть еще два поля, которые находятся в моей базе данных, которые не загружаются. Я не могу их инициализировать, используя __setattr__, потому что переменная __table еще не инициализирована, а также __id, и python не может вызвать метод загрузки и отправить запрос.

Возможно, я поставил неправильную логику в своем решении, и значения из db не должны инициироваться так.

+0

В следующий раз включите ошибку, которую вы получаете при попытке присвоить значения. Я подозреваю, что load() запускает несколько разных ошибок в зависимости от условий, и было бы легче быть уверенными в ответах при включении ошибок. Это также помогает показать, что вы попробовали пару вещей, прежде чем обращаться за помощью. – acrosman

ответ

1

Похоже, что ваш метод load() присвоит вам другие два значения, что означает, что он будет звонить по меньшей мере в два раза по номеру __setattr__(). Если у вас нет логики в load(), чтобы избежать этого, вы почти наверняка создаете бесконечный цикл. Метод базовой загрузки вряд ли вы хотите вызвать из __setattr__(), так как это может вызвать неожиданные побочные эффекты (например, в любое время, когда вы обновляете любое значение для объекта, все значения в базе данных будут сброшены).

Просто переместите load() на номер __init__() и получите __setattr__() целиком.

def __init__(self, id=None): 
    self.__id  = id 
    self.__table = self.__class__.__name__.lower() 
    self.load() 
+0

Yeap, хороший совет. Но есть ли способ в python поместить нагрузку в setattr, поэтому сначала начнется __table, а затем будет вызван метод загрузки? – ovod

+0

Уверен: сделать вызов нагрузки условным на наличие __table. Это, вероятно, не очень хорошая идея; вам нужно будет что-то сделать, чтобы функция load() не вызывала __setattr __(), что также возможно, но уродливо. Вы должны убедиться, что у вас есть повод для обоснования выбора дизайна. – acrosman

Смежные вопросы