2013-05-09 3 views
1

У меня есть класс, который принимает идентификатор и пытается обновить переменную current_account, но когда я распечатываю данные текущего_account, он не обновляется.Переменная класса Python не обновляется

У кого-нибудь есть идеи для этого? Новое для python, возможно, делает что-то глупое, чего я не вижу.

class UserData: 
    def __init__(self, db_conn=None): 
     if None == db_conn: 
      raise Exception("DB Connection Required.") 

     self.db = db_conn 
     self.set_my_account() 
     self.set_accounts() 
     self.set_current_account() 

    def set_current_account(self, account_id=None): 
     print account_id 
     if None == account_id: 
      self.current_account = self.my_account 
     else: 
      if len(self.accounts) > 0: 
       for account in self.accounts: 
        if account['_id'] == account_id: 
         self.current_account = account 
         print self.current_account['_id'] 
      else: 
       raise Exception("No accounts available.") 

Предположим, что set_my_account() получает словарь данных учетных записей и set_accounts() получить список словарей учетных данных.

Так что, когда я делаю следующее:

user_data = UserData(db_conn=db_conn) 
user_data.set_current_account(account_id=account_id) 

Где db_conn является действительным соединением с базой данных и account_id является действительным идентификатором аккаунта.

Я получаю следующее из двух вышеуказанных строк.

None 
518a310356c02c0756764b4e 
512754cfc1f3d16c25c350b7 

Таким образом, значение None от декларации класса, а затем следующий два из вызова set_current_account(). Первое значение id - это то, что я пытаюсь установить. Второе значение id - это то, что уже было установлено из метода класса __init__().

+3

Обратите внимание, что 'None == account_id' вряд ли является идиоматическим Python. 'None' - это одноэлементный объект, используйте' if account_id is None: ', чтобы проверить его. –

+3

Для записи ваш вопрос касается переменной ** экземпляра **, а не переменной класса, и при определении ваших собственных классов вы всегда должны наследовать от 'object', например:' class UserData (object): ' –

+0

Спасибо для информации, обновит класс, как было предложено. – Nalum

ответ

0

Выяснено, что это было.

Данные были изменены иначе, где в базе кода. Теперь он работает так, как ожидалось.

Спасибо, ребята за то, что указали на то, что я делал неправильно, хорошо, чтобы получить его.

2

Было много увольнений не-питоновских конструкций. Я очистил код, чтобы помочь мне понять, что вы пытаетесь сделать.

class UserData(object): 
    def __init__(self, db_conn): 
     self.db = db_conn 
     self.set_my_account() 
     self.set_accounts() 
     self.set_current_account() 

    def set_current_account(self, account_id=None): 
     print account_id 
     if account_id is None: 
      self.current_account = self.my_account 
     else: 
      if not self.accounts: 
       raise Exception("No accounts available.") 

      for account in self.accounts: 
       if account['_id'] == account_id: 
        self.current_account = account 
        print self.current_account['_id'] 

user_data = UserData(db_conn) 
user_data.set_current_account(account_id) 

Вы использовали аргументы по умолчанию (db_conn=None) при вызове без явного аргумента является недопустимым. Да, вы можете позвонить по телефону: __init__(None), но вы можете позвонить по телефону: __init__('Nalum'); вы не можете защитить от всего.

Перемещая исключение «Нет учетных записей», блок быстро сработает и вы сохраните один уровень отступов.

Вызов UserData (db_conn = db_conn) действителен, но необязательно повторяется.

К сожалению, я до сих пор не могу понять, что вы пытаетесь выполнить, и это, пожалуй, самый большой недостаток. Имена переменных очень важны для того, чтобы помочь читателю (который может быть в будущем) понять код. current_account, my_account, account_id и current_account['_id'] так скрывают намерение, что вы должны действительно рассмотреть более четкие, информативные имена.

+0

Спасибо за отзыв, я обновил свой код, чтобы отразить информацию. Я исхожу из PHP-фона, поэтому я предполагаю, что вношу часть этого кода. То, что я пытаюсь сделать, это создать переключатель учетных записей. Таким образом, 'my_account' является зарегистрированной учетной записью пользователя, а' current_account' - это то, что система считывает, поэтому пользователь может переключаться на учетные записи. Возможно, есть лучший способ сделать это. 'account_id' - это буквально идентификатор учетной записи, на которую мы хотим перейти. – Nalum

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