我遇到了班级变量的问题。我试图找出我能用课程做的所有事情。我决定创建一个银行帐户类并最终创建子类,但我却试图创建独特的银行帐户。
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 :(得分:1)
类变量附加到类,而不是实例。这意味着它们在实例之间共享(因此在这种情况下,列表对于所有实例都是相同的)。
您可以在__init__
方法中创建特定于实例的变量。一个简单的例子:
class BankAccount(object):
def __init__(self):
self.account_names = []
通常,如果只使用不可变类型作为类变量(如str,tuple等),则不会看到类级变量和实例级之间的差异。从不将可变类型(如dict
或list
)设置为类变量通常是一个好主意。
答案 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,因为该对象是其他对象的组合。
银行只是一种在一起引用大量账户的方式。