2014-10-01 4 views
0

У меня возникают проблемы с переменными уровня класса. Я пытаюсь понять все, что я могу делать с классами. Я решил создать классы банковских счетов и в конечном итоге подклассы, но я повесил трубку, пытаясь создать уникальные банковские счета.Переменные уровня класса python

class BankAccount(object): 
    """Creates Bank Account and Functions""" 
    account_names = [] 

    ### Bank Account 
import random 

class BankAccount(object): 
    """Creates Bank Account and Functions""" 
    account_names = [] 

    def __init__(self, name, balance = 0): 
     try: # because account_name doesn't exit until the first instnace 
      for people in account_names: #iterate account names 
       if people == name: #check if name is in class_var 
        print "Name already exists!" 
        break #end instantiation 
       else: # its a unque name add to the class and object 
        self.name = name 
        self.account_names.append(self.name) 
     except: #First intantition 
      self.name = name 
      self.account_names.append(self.name) 

     self.balance = float(balance) 

Если бы я мог проверить уникальные self.account данных, чем я могу реализовать механизм оплаты между держателями банковских счетов. Однако я могу выяснить, как это сделать. Я думал, что вары уровня класса будут делать трюк, но мои из положить являются:

['Bernie', 'Jerry'] 
['Bernie', 'Jerry'] 
['Bernie', 'Jerry', 'Jerry'] 

Что означает, что только добавляет и поэтому исключение произошло (правильно?), Почему я до сих пор получаю исключение переменными выхожу, так как это добавление.

Вот ссылка на gist

+0

Ваша переменная - это именно то, что вы назвали ее: переменная уровня класса. Он принадлежит классу, а не экземпляру класса. 'self.account_names' на самом деле' BankAccount.account_names', поэтому все экземпляры 'BankAccount' имеют ровно один и тот же список' account_names'. Создайте свой список в методе '__init__', и он будет переменной экземпляра. – Blender

+0

Как бы я назвал это внутри класса: __class__. или cls. вместо себя? – Grouchy

+0

Вы не хотите, чтобы он был частью класса, поэтому поместите 'self.account_names = []' в начало метода '__init__'. – Blender

ответ

0

В (реальном) банке банк знает информацию обо всех своих счетах. Каждая учетная запись содержит информацию о владельце счета и балансе счета и транзакциях; но он ничего не знает о других клиентах/счетах.

Чтобы перевести деньги с одного счета на другой, банк должен быть привлечен.

Вам необходимо реализовать подобные вещи здесь. Ваш «банк» может быть классом, который содержит коллекцию других учетных записей.

class Bank(object): 
    def __init__(self, name): 
     self.name = name 
     self.accounts = [] # Note - this is at the instance level 
          # so multiple banks don't share each other's accounts 

    def add_account(self, account): 
     self.accounts.append(account) 

    def delete_account(self, account): 
     try: 
      self.accounts.remove(account) 
     except ValueError: 
      print('{} is already deleted.'.format(account)) 

    def transfer(self, from_acct, to_acct, amount): 
     if amount < from_account.get_balance(): 
      print('{} is less than the balance of the from account'.format(amount)) 
     to_account.credit(amount) 
     from_account.debit(amount) 

Теперь каждый счет имеет свою собственную информацию

class Account(object): 

    def __init__(self, name, balance): 
     self.name = name 
     self.balance = balance 

    def credit(self, amount): 
     self.balance += amount 

    def debit(self, amount): 
     self.balance -= amount 

    def get_balance(): 
     return self.balance 

Теперь вы можете сделать это:

account_one = Account('John Smith', 500) 
account_two = Account('Jane Smith', 100) 

bank = Bank("The Bank O'Money") 
bank.add_account(account_one) 
bank.add_account(account_two) 
bank.transfer(account_one, account_two, 10) 
bank.accounts # <-- this will be a list of two objects 

another_bank = Bank("The Bank of Even More Money") 
another_bank.accounts # <-- this will be empty 

Этот вид рисунка - где куча объектов должны упоминаться как один называется composite pattern, потому что объект составлен других объектов.

Банк - это всего лишь способ сослаться на кучу счетов вместе.

+0

Это очень помогает. Я только что узнал о композиции, и это имеет смысл иметь два отдельных класса. – Grouchy

0

переменных класса прикрепляются к классу, а не экземпляр. Это означает, что они разделяются между экземплярами (поэтому в этом случае список одинаковый для всех экземпляров).

Вы можете создавать экземпляры определенных переменных внутри метода __init__. Простой пример:

class BankAccount(object): 
    def __init__(self): 
     self.account_names = [] 

Как правило, вы не будете видеть различие между переменным уровнем класса и экземплярами уровнем, если вы просто использовать immutables типы в качестве переменного класса (например, ул, кортеж, и т.д.). Обычно рекомендуется никогда не устанавливать изменяемые типы, такие как dict или list, как переменные класса.

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