2014-10-01 121 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 2014-10-01 01:21:13

+0

如何在類中調用它:__class__。或cls。而不是自我? – Grouchy 2014-10-01 02:10:56

+0

你不希望它成爲類的一部分,所以把'self.account_names = []'放在'__init__'方法的頂部。 – Blender 2014-10-01 02:55:22

回答

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 2014-10-02 19:00:15

0

類變量的鏈路連接到類,而不是實例。這意味着它們在實例之間共享(所以在這種情況下,所有實例的列表都是相同的)。

您可以在__init__方法內創建實例特定變量。一個簡單的例子:

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

通常情況下,你不會看到類級別的變量和實例級之間的差別,如果你只是使用immutables類型爲類變量(如海峽,元組等)。通常不要將可變類型設置爲類變量,如dictlist