OOP - 初始化方法不更改 class 属性
OOP - init method not changing class attribute
我正在尝试使用 CheckingAccount
class 中的 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 属性吗?
---更新---
我想要完成的目标是找出用户是否已经创建了一个储蓄账户。我还有其他用户 classes,但我没有包括在内,因为这有点过分了。但是,目标是防止用户在没有储蓄账户的情况下将钱从支票转为储蓄。
您实际上并没有使用此行创建 SavingAccount
的实例:
self.SavingAccount = SavingAccount
您正在将 self.SavingAccount
属性 分配给下面定义的 SavingAccount
class。
您需要调用 SavingAccount
构造函数,如下所示:
self.saving_account = SavingAccount(account_number)
请注意,Python 约定是对 attributes/variables 使用 lower_snake_case
,对 class 名称使用 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
最后,SavingAccount
的has_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
时,您正在建立一个作为实例一部分的实例变量。您没有修改 class 变量。要修改 class 变量,您需要使用 class 名称而不是 self.
引用。
我正在尝试使用 CheckingAccount
class 中的 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 属性吗?
---更新---
我想要完成的目标是找出用户是否已经创建了一个储蓄账户。我还有其他用户 classes,但我没有包括在内,因为这有点过分了。但是,目标是防止用户在没有储蓄账户的情况下将钱从支票转为储蓄。
您实际上并没有使用此行创建 SavingAccount
的实例:
self.SavingAccount = SavingAccount
您正在将 self.SavingAccount
属性 分配给下面定义的 SavingAccount
class。
您需要调用 SavingAccount
构造函数,如下所示:
self.saving_account = SavingAccount(account_number)
请注意,Python 约定是对 attributes/variables 使用 lower_snake_case
,对 class 名称使用 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
最后,SavingAccount
的has_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
时,您正在建立一个作为实例一部分的实例变量。您没有修改 class 变量。要修改 class 变量,您需要使用 class 名称而不是 self.
引用。