OOP - init 方法不改变类属性

问题描述

我正在尝试在 transfer_to_saving 类中使用 CheckingAccount 方法。但是,每当我创建 SavingAccount 对象时,self.has_saving = True 都不会将类属性更改为 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 方法不应该改变类属性吗?

---更新---

我试图完成的目标是查明用户是否已经创建了一个储蓄账户。我还有一些没有包含的用户类,因为这有点矫枉过正。然而,目标是防止用户在没有储蓄账户的情况下将钱从支票转移到储蓄。

解决方法

您实际上并未使用以下行创建 SavingAccount 的实例:

        self.SavingAccount = SavingAccount

您正在将 self.SavingAccount attribute 分配给下面定义的 SavingAccount class

您需要调用 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,checking_account):
        super().__init__(account_number)
        self.checking_account = checking_account

这样,每当您创建一个 CheckingAccount 时,您都会获得一个相应的 SavingAccount,并且它们每个都将拥有彼此的引用。我认为它在概念上仍然有点奇怪,因为帐号是相同的,所以最好像这样单独创建它们:

class CheckingAccount(Account):
    def __init__(self,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

最后,has_savingSavingAccount 属性根本不是必需的。检查 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. 引用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...