【问题标题】:How to implement transfer method for a account class in python如何在python中实现账户类的转账方法
【发布时间】:2019-01-13 20:03:21
【问题描述】:

所以,我正在 python 中创建一个 Account 类。它具有存款、取款和查看余额的基本功能。不过,我在传输方法上遇到了麻烦。 这是我的代码(抱歉代码转储):

class Account:
    """simple account balance of bank"""
    def __init__ (self, name, balance):
        self.name = name
        self.balance = balance
        print('Account of ' + self.name)
    def deposit(self, amount):
        if amount > 0:
            self.balance += amount
            self.statement()
    def withdrawal(self, amount):
        if amount > 0 and self.balance > amount:
            self.balance -= amount
            self.statement()
        else:
            print("the ammount in your is not sufficent")
            self.statement()
    def statement(self):
        print("Hi {} your current balance is {}".format(self.name,self.balance))
    def transfer(self, amount, name):
        self.balance = self.balance - amount
        name.balance = name.balance + amount 
        return name.balance()

现在,它适用于

abc = Account("abc", 0)
abc.deposit(1000)
siddharth = Account("siddharth", 159)

那么我该如何运行以下代码:

siddharth.transfer(11, "abc")
siddharth.transfer(11, Account.abc)

另外,如果帐户“abc”不存在,我如何创建帐户“abc”

【问题讨论】:

  • 问题是你写的转移方法期望name是一个Account对象(你正在调用name.balance)而name实际上是一个str("abc")
  • 显示我应该如何定义传递函数,我希望函数将金额传递给同一类的另一个对象
  • 谢谢,@PatrickArtner 但解释器说“”TypeError: 'int' object is not callable"' 我希望能够使用帐户名称,而不是我给它的名称,如果这样的话感觉?所以我想说 Siddharth 已将 11 转移到帐户 abc siddharth.transfer(11,abc) 我只是不知道该怎么做。
  • 一种方法是有一个查找功能,在转移之前首先找到帐户对象。找到对象后,可以在 transfer() 方法中传递它。如果没有找到,您可以创建一个对象并将其传递给 siddarth.transfer()
  • siddharth.transfer(11, abc)

标签: python python-3.x class oop object


【解决方案1】:

您的代码将成为您处理变量/参数命名的最佳课程。你的方法transfer(self, amount, name) 应该是transfer(self, amount, account)。我认为现在,很明显正确的代码是

abc = Account("abc", 0)
abc.deposit(1000)
siddharth = Account("siddharth", 159)
siddharth.transfer(11, abc)

小心误导性名称。

除了你的问题,我认为帐户不应该有 transfer 方法。 Account 只关心存款和取款,而不关心它们的用途。 IMO Transfer 应该是一个带有 2 个 Account 参数的函数,从第一个中提取,在第二个中进行存款。这只是为了遵循单一职责原则。

遵循同样的原则,不要将打印功能放在帐户中。考虑到你不知道你的类将被使用的上下文。如果是在 Web 应用程序中,打印将重定向到 /dev/null...

最后,永远按你说的去做。如果我有一个余额为 b 的账户,我希望在调用 v 存款后,我的账户余额将为 b + v。不管 v 的值是多少。你是对的,检查值而不是添加 a负值(即撤回),因此您必须警告调用者您不会添加该值,因此引发异常。撤回也一样。

【讨论】:

    【解决方案2】:

    您可以首先在某处声明所有帐户的数组。然后,您可以先尝试查找帐户是否存在。如果没有,请创建一个帐户并传递它们。

    allAccounts = []
    
    #create bunch of accounts including 'abc'
    
    siddharth = Account("siddharth", 159)
    
    searchResult = [x for x in allAccounts if x.name == 'abc']
    #assuming that account names are unique
    if len(searchResult) == 0:
       acc = Account("abc", 11)
    else:
       acc = searchResult[0]
    
    siddarth.transfer(11, acc)
    

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 2018-08-06
      • 2017-11-08
      • 2016-03-25
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2014-08-27
      相关资源
      最近更新 更多