Как вы называете дочерний класс питонически? - PullRequest
0 голосов
/ 14 ноября 2018

Я недавно начал изучать ООП на Python, и чтобы проверить свои навыки построения классов и наследования, я создал простую структуру для банковского приложения.Насколько я могу судить, основываясь на моих знаниях о том, как наследование выполняется в ООП, с моим синтаксисом в коде нет ничего плохого:

import pickle, sys, datetime

class Bank():

    def __init__(self):
        with open('accounts.txt','rb') as fp:
            accounts=pickle.load(fp)

    def exit(self):
        with open('accounts.txt','wb') as fp:
            pickle.dump(accounts,fp)
        sys.exit()

class TransactionMenu(Bank):

    def __str__(self,account):
        if str(super().accounts[account])[::-1].find('.')==-1:
            nT=str(super().accounts[account])+'.00'
        elif str(super().accounts[account])[::-1].find('.')==1:
            nT=str(super().accounts[account])+'0'
        else:
            nT=str(super().accounts[account])
        return '£'+nT

    def balanceEnquiry(self,account):
        print('Date:    '+datetime.datetime.now()+'\n'+'Account name:    '+account+'\n'+'Balance:    '+self.__str__(account))

    def deposit(self,account):
        while True:
            print('current balance:    '+self.__str__(account))
            amt=input('enter deposit amount: ')
            try:
                if '.' in amt:
                    amt=float(amt)
                else:
                    amt=int(amt)
                super().accounts[account]+=amt
                print('new balance:    '+self.__str__(account))
                break
            except:
                pass

    def withdraw(self,account):
        while True:
            print('current balance:    '+self.__str__(account))
            amt=input('enter withdrawal amount: ')
            try:
                if '.' in amt:
                    amt=float(amt)
                else:
                    amt=int(amt)
                super().accounts[account]-=amt
                print('new balance:    '+self.__str__(account))
                break
            except:
                pass

    def __init__(self,account):    
        while True:
            choice=input('enter balance enquiry, deposit, withdraw or exit: ').lower()
            if choice=='b' or choice=='balance' or choice=='balance enquiry' or choice=='enquiry' or choice=='balance enquiry' or choice=='bal':
                self.balanceEnquiry(account)
            elif choice=='d' or choice=='deposit':
                self.deposit(account)
            elif choice=='w' or choice=='withdraw':
                self.withdraw(account)
            elif acc=='e' or acc=='exit':
                super().exit()

class Menu(Bank):

    def logIn(self):
        while True:
            accN=input('enter your account name or exit: ').lower()
            if acc=='e' or acc=='exit':
                super().exit()
            else:
                for account in super().accounts:
                    if accN==account:
                        TransactionMenu(accN)
                        break

    def createAccount(self):
        while True:
            newAcc=input('enter your forename and surname or exit: ').lower()
            if acc=='e' or acc=='exit':
                super().exit()
            else:
                super().accounts[newAcc]=0.00

    def __init__(self):
        while True:
            acc=input('enter login, register or exit: ').lower()
            if acc=='l' or acc=='login' or acc=='log in' or acc=='log-in':
                self.logIn()
                break
            elif acc=='r' or acc=='register' or acc=='reg':
                self.createAccount()
                break
            elif acc=='e' or acc=='exit':
                super().exit()


Bank().Menu()

Однако, когда я вызываю Bank (). Menu (), Я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\xavier\Desktop\bank\bank.py", line 104, in <module>
    Bank().Menu()
AttributeError: 'Bank' object has no attribute 'Menu'

Это будет означать, что я не выполнил свое наследование должным образом, однако я не вижу, как это происходит.

Любая помощьвысоко ценится.

1 Ответ

0 голосов
/ 14 ноября 2018

Определение Menu подобно class Menu(Bank) означает, что Bank является суперклассом Menu.

Menu будет наследовать все от Bank, но это наследование может быть переопределено путем переопределения вдочерний класс.

Объявление чего-либо как суперкласса, насколько я знаю, не определяет дочерний класс внутри суперкласса.

Я не уверен, что вы пытаетесь сделать, поэтомутрудно дать вам совет о том, что вы должны делать.Я надеюсь, что это что-то объясняет, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...