类级别变量python

时间:2014-10-01 01:19:28

标签: python-2.7

我遇到了班级变量的问题。我试图找出我能用课程做的所有事情。我决定创建一个银行帐户类并最终创建子类,但我却试图创建独特的银行帐户。

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

的链接

2 个答案:

答案 0 :(得分:1)

类变量附加到类,而不是实例。这意味着它们在实例之间共享(因此在这种情况下,列表对于所有实例都是相同的)。

您可以在__init__方法中创建特定于实例的变量。一个简单的例子:

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

通常,如果只使用不可变类型作为类变量(如str,tuple等),则不会看到类级变量和实例级之间的差异。从不将可变类型(如dictlist)设置为类变量通常是一个好主意。

答案 1 :(得分: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,因为该对象是其他对象的组合

银行只是一种在一起引用大量账户的方式。