作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个 ATM 游戏,该游戏使用 10 个帐户(从 0-9)的列表,并且所有帐户都设置为 100 开始。我在 main() 函数中根据需要设置了所有循环和菜单项,但我认为我的帐户类设置不正确,因为当我将参数传递给类函数时,我得到了错误。有没有办法让我在类里面启动一个空列表来开始?还是我在 main() 函数中犯了其他错误?
这是我在选择菜单项 1 以获得余额时遇到的错误:
File "/Users/Beadog/PycharmProjects/M08_12.3/gameATMMachine.py", line 82, in getBalance
return format(self.__balance, ".2f")
AttributeError: 'int' object has no attribute '_Account__balance'
完整代码如下:
class Account:
def __init__(self, id = 0, balance = 100):
self.__id = id
self.__balance = balance
def getId(self):
return self.__id
def getBalance(self):
return format(self.__balance, ".2f")
def setID(self, id):
self.__id = id
def setBalance(self, balance):
self.__balance = balance
def withdrawal(self, withdrawalAmount):
if withdrawalAmount < self.__balance:
self.__balance -= withdrawalAmount
else:
print("Insuficient Funds.")
def deposit(self, depositAmount):
self.__balance += depositAmount
def main():
accounts = []
for i in range(10):
accounts.append(Account(i, 100))
while True:
id = eval(input("Enter account ID: "))
if id >= 0 and id <= 9:
print()
print("Main menu")
print("1: check balance")
print("2: withdraw")
print("3: deposit")
print("4: exit")
print()
menuChoice = eval(input("Enter a choice: "))
print()
while menuChoice != 4:
if menuChoice == 1:
balance = Account.getBalance(id)
print("The balance is ", balance)
print()
print("Main menu")
print("1: check balance")
print("2: withdraw")
print("3: deposit")
print("4: exit")
print()
menuChoice = eval(input("Enter a choice: "))
print()
elif menuChoice == 2:
withdrawalAmount = eval(input("Enter withdrawal amount: "))
Account.withdrawal(id, withdrawalAmount)
print()
print("Main menu")
print("1: check balance")
print("2: withdraw")
print("3: deposit")
print("4: exit")
print()
menuChoice = eval(input("Enter a choice: "))
print()
elif menuChoice == 3:
depositAmount = eval(input("Enter deposit amount: "))
Account.deposit(id, depositAmount)
print()
print("Main menu")
print("1: check balance")
print("2: withdraw")
print("3: deposit")
print("4: exit")
print()
menuChoice = eval(input("Enter a choice: "))
print()
else:
menuChoice = eval(input(("Please enter a valid menu choice (1-4): ")))
print()
else:
print("Account ID must be a number between 0 and 9. Please try again.")
print()
main()
最佳答案
简答:像这样改变行:
balance = Account.getBalance(id)
为此:
balance = accounts[id].getBalance()
长答案:
您似乎误解了 python 类的工作原理 - 什么是类,什么是类的实例。让我纠正您的代码显示的其中一些误解。
balance = Account.getBalance(id)
这样的行,您调用的是类,而不是类的实例。您知道这一点是因为您使用的是 Account
这个词,它是类的名称,而不是一个包含 Account
实例的变量。事实上,在您的代码的前面,您创建了列表 accounts
,其中包含 10 个 Account
实例 - 您应该在这些实例上调用该函数。换句话说,要在 accounts
列表中 Account
的第 id
实例上调用函数 getBalance()
,你会做 accounts[id].getBalance()
。self
参数是总是 隐含的。当您在类的实例上调用函数时——例如,accounts[id].getBalance()
,您用来调用该函数的实例将作为第一个参数传递。在这种情况下,参数 self
将是 accounts[id]
。请注意,您不需要因此将其放在括号中。
Account.getBalance(accounts[id])
,这会将 accounts[id]
作为 self
参数。关于python - 如何用Python调用这个ATM机器游戏中的父类(super class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52798109/
我是一名优秀的程序员,十分优秀!