OOP-init方法不更改类属性



我正在尝试在CheckingAccount类中使用transfer_to_saving方法。但是,无论何时创建SavingAccount对象,self.has_saving = True都不会将class属性更改为True。所以,每当我试图转移资金时,它都会打印Must create a saving account

class CheckingAccount(Account):
balance = 0
def __init__(self, account_number, pin):
super().__init__(account_number)
self.SavingAccount = SavingAccount
self.pin = pin
def deposit(self, amount):
old_bal = self.balance
self.balance += amount
print(f'Previous Balance: ${old_bal}nDeposit amount: ${amount}nNew Balance: ${self.balance}')
def withdraw(self, pin, amount):
if pin == self.pin:
self.balance -= print('Insufficient funds') if amount > self.balance else amount
else:
print('Invalid PIN')
def transfer_to_saving(self, amount):
if self.SavingAccount.has_saving is False:
print('Must create a saving account')
elif amount > self.balance:
print('Insufficient funds')
else:
self.SavingAccount.balance += amount
self.balance -= amount

class SavingAccount(Account):
balance = 0
has_saving = False
def __init__(self, account_number):
super().__init__(account_number)
self.CheckingAccount = CheckingAccount
self.has_saving = True
def deposit(self, amount):
self.balance += amount

我这样做对吗?init方法不应该更改class属性吗?

---更新---

我试图实现的目标是找出用户是否已经创建了一个储蓄帐户。我有额外的用户类,我没有包括,因为这会有点过头。然而,目标是防止用户在没有储蓄账户的情况下将钱从支票转移到储蓄。

您实际上并没有用以下行创建SavingAccount的实例:

self.SavingAccount = SavingAccount

您正在将self.SavingAccount属性分配给下面定义的SavingAccount

您需要调用SavingAccount构造函数,如下所示:

self.saving_account = SavingAccount(account_number)

请注意,Python约定是将lower_snake_case用于属性/变量,将UpperCamelCase用于类名。

SavingAccount构造函数中,您在这一行执行相同的操作

self.CheckingAccount = CheckingAccount

我不确定这里的目标是什么,但如果你希望每个SavingAccount都有一个对CheckingAccount的引用,反之亦然,那么这样做可能会更干净:

class CheckingAccount(Account):
def __init__(self, account_number, pin):
super().__init__(account_number)
self.saving_account = SavingAccount(account_number, self)
self.pin = pin
class SavingAccount(Account):
def __init__(self, account_number, checking_account):
super().__init__(account_number)
self.checking_account = checking_account

这样,无论何时创建一个CheckingAccount,都会得到一个相应的SavingAccount,它们都将包含彼此的引用。我认为这在概念上仍然有点奇怪,因为帐号是一样的,所以最好像这样单独创建:

class CheckingAccount(Account):
def __init__(self, account_number, pin):
super().__init__(account_number)
self.saving_account = None  # to be assigned later
self.pin = pin
class SavingAccount(Account):
def __init__(self, account_number):
super().__init__(account_number)
self.checking_account = None  # to be assigned later

checking_account_number = 123
checking = CheckingAccount(checking_account_number)
saving_account_number = 456
saving = SavingAccount(saving_account_number)
checking.saving_account = saving
saving.checking_account = checking

最后,SavingAccounthas_saving属性根本不是必需的。检查SavingAccount是否更干净的方法是使用isinstance:

def transfer_to_saving(self, amount):
if not isinstance(self.saving_account, SavingAccount):
print('Must create a saving account')
elif amount > self.balance:
print('Insufficient funds')
else:
self.saving_account.balance += amount
self.balance -= amount

执行self.has_saving = True时,您正在建立一个实例变量,该变量是实例的一部分。您没有修改类变量。要修改类变量,您需要使用类名而不是self.引用。

最新更新