2013-05-09 3 views
1

ID를 가져 와서 current_account 변수를 업데이트하려고하는 클래스가 있는데, current_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()는 계정 데이터 사전의 목록을 얻을.

그래서 나는 다음 작업을 수행 할 때 : db_conn가 유효한 데이터베이스 연결과 account_id가 유효한 계정 ID입니다

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

.

위의 두 줄 중에서 다음과 같은 내용을 얻을 수 있습니다.

None 
518a310356c02c0756764b4e 
512754cfc1f3d16c25c350b7 

는 그래서 None 값은 클래스의 선언에서이며, 그 다음 두 set_current_account()에 대한 호출에서입니다. 처음으로 id 값을 설정하려고합니다. 두 번째 id 값은 이미 __init__() 클래스에서 설정 한 값입니다.

+3

'None == account_id'는 거의 관용적이지 않은 파이썬입니다. 'None'은 싱글 톤 객체이고, if account_id가 None :을 사용하여 테스트합니다. –

+3

기록상, 당신의 질문은 클래스 변수가 아닌 ** 인스턴스 변수 **에 관한 것이고, 자신 만의 클래스를 정의 할 때'object'로부터 상속 받아야합니다 :'class UserData (object) :' –

+0

Thanks 정보에 대해 제안 된대로 클래스를 업데이트합니다. – 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_idcurrent_account['_id'] 그래서 더 명확하고 유익한 이름을 고려해야한다는 의도를 모호하게 만듭니다.

+0

의견을 보내 주셔서 감사합니다. 정보를 반영하도록 코드를 업데이트했습니다. 나는 PHP 배경에서 왔기 때문에, 그 중 일부를 내 코드로 가져오고있다. 내가하려는 것은 계정 전환기를 만드는 것입니다. 그래서'my_account'는 로그인 한 사용자 계정이고'current_account'는 시스템이 읽는 계정입니다. 그래서 사용자는 계정을 전환 할 수 있습니다. 아마도 그것을하는 더 좋은 방법이있을 것입니다. 'account_id'는 말 그대로 우리가 전환하고자하는 계정의 ID입니다. – Nalum

관련 문제