Как исправить ошибку атрибута, сгенерированную из дочернего класса в python

#python #class #object #inheritance #attributeerror

Вопрос:

Я создаю простую банковскую систему; в моем коде я хочу, чтобы сначала запускалась функция меню в родительском классе, а затем, когда пользователь выбирает опцию, она переходит к учетным записям дочернего класса. Я создал новое свойство в дочернем классе self.bankdata Методы, которые я создал, используют это свойство. Но когда я запускаю его, и он доходит до точки, он предназначен для печати банковских данных. Он выводит сообщение об ошибке AttributeError: 'Customer' object has no attribute 'bankdata' . Я в замешательстве, потому что это должно работать с тех пор, как я добавил переменную экземпляра в init .Пожалуйста, как я могу это исправить, так как я новичок в Python

 from random import randrange from secrets import randbelow import collections import time # "${:,.2f}".format(float(0))   class Customer:  def __init__(self, Fname = "Please enter your First name:", Lname = "Please enter your Last name:", email = "Please enter your email:", balance = 0):  self.Fname = Fname   self.Lname = Lname   self.email = email  self.balance = balance      def menu(self):  print ("-----------------------------------------------")  print("Welcome to Dangote's Wellings Bank")  print ("-----------------------------------------------")  print("1.Create an account n2.Log in to your acccount n3.Exit")  menu_option = int(input())  if menu_option == 1:  Accounts.create_account(self)  if menu_option == 2:  Accounts.log_in(self)  if menu_option == 3:  self.exit_bank()  class Accounts(Customer):  def __init__(self, Fname, Lname, email, bankdata = collections.defaultdict(dict)):  super().__init__(Fname, Lname, email)  self.bankdata = bankdata   def create_account(self):  print("n")  firstname = input(self.Fname)  lastname = input(self.Lname)  global account_name  account_name = firstname   " "   lastname  input(self.email)    card_number = f'400000{randrange(1e10):010}'  pin_request = input(  "Would you like the bank to issue your unique PIN or create your PIN yourself (Issue/Create): ")   if pin_request == "Issue":  pin_number = f'{randbelow(10_000):04}'  elif pin_request == "Create":  pin_number = input("Enter your desired 4 DIGIT PIN: ")  else:  print("Invalid Input please try again")  self.create_account()   print(  f'nYour card has been creatednAccount Name:n{account_name} nYour card number:n{card_number}nYour card PIN:n{pin_number}')   #WHERE THE ERROR OCCURS   self.bankdata[account_name][card_number] = pin_number  print(self.bankdata)  print("nYou can now log in")  self.menu()   def log_in(self):  for key, value in self.bankdata.items():  if isinstance(value, dict):  for card_no, card_pin in value.items():  if key == account_name:  global card_login  card_login = input("Enter your card number: ")  pin_login = input("Enter your PIN: ")   if card_login == card_no and pin_login == card_pin:  print(f'nYou have successfully logged in')  Bankingsystem.operation_to_perform(self)  else:  print("n Wrong Card or PIN!")  time.sleep(2)  self.menu()   def log_out(self):  print("You have successfully logged out")  self.menu()  def exit_bank(self):  print("Thanks for banking with us, we hope to see you next time. Bye!")   C1 = Customer() C1.menu()  

Ожидаемый результат предназначен для печати созданного справочника self.bankdata. Кроме того, у меня все еще будет другой класс, в котором мне нужно будет унаследовать банковские данные от класса Счетов.

Комментарии:

1. Вы никогда не создаете экземпляр Accounts класса, поэтому ничто в нем .__init__() никогда не выполняется.

Ответ №1:

Все правильно, в нем нет атрибута bankdata Customer , вместо этого вы должны создать Accounts экземпляр :

 C1 = Accounts(...,...,...)