Я пытаюсь использовать агрегацию, но думаю, что я ошибаюсь - PullRequest
0 голосов
/ 25 апреля 2020

Итак, я написал код с классом Bank, у которого есть метод проверки, и с классом SavingAccount, у которого есть метод изъятия, и я пытаюсь использовать агрегацию, чтобы связать их обоих, но это не работает. Валидация проверяет все. Основное внимание должно быть уделено классу Bank и классу SavingAccount, и в конце я помещаю экземпляр, который не должен работать (acc1.withdraw ()), я помещаю другие классы, чтобы вы могли опробовать код, в любом случае здесь код:

Ожидаемое поведение : Без вызова функции add_a cc () проверка должна возвращать False, и она не должна позволять мне использовать функцию изъятия ().

Фактическое поведение : я могу снять (), даже когда add_a cc () не был вызван

from abc import ABC, abstractmethod


class Account(ABC):
    def __init__(self, agency, acc_number, balance):
        self.agency = agency
        self.acc_number = acc_number
        self.balance = balance

    @abstractmethod
    def withdraw(self, value):
        pass


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


class Bank:
    def __init__(self):
        self.account = {}

    def add_acc(self, client, account):
        self.account.update({f'{client}': account})

    def validation(self):
        if self.account:
            for acc in self.account:
                if acc in self.account:
                    return True
                else:
                    return False


class SavingAccount(Account):
    if Bank.validation:
        def withdraw(self, value):
            if self.balance < value:
                print('Insufficient funds.')
                return
            self.balance -= value
            print(f'{value} dollars withdrawn. Current balance: {self.balance}$')
    else:
        print('Account information invalid.')


class Client(Person):
    def __init__(self, name, age, acc_type):
        super().__init__(name, age)
        self.acc_type = acc_type

bank1 = Bank()
acc1 = SavingAccount(33333, 33330, 2000)
client1 = Client('Matthew', 40, acc1)
acc1.withdraw(500)   # Right here this shouldn't work without me adding bank1.add_acc()

1 Ответ

2 голосов
/ 25 апреля 2020

У вашего кода есть две основные проблемы.

Во-первых, ваша реализация SavingsAccount имеет серьезные недостатки. Вы проверяете, правдива ли Bank.validate, а не называете это. Но даже если вы позвоните, это не будет иметь никакого смысла в том месте, где вы звоните. Вы пытаетесь выполнить проверку , когда класс определен , а не когда вы создаете экземпляр класса или пытаетесь вывести средства. Это не имеет никакого смысла. Концепция сберегательных счетов (то есть определение класса) должна существовать, даже если еще не было создано ни одного банка. Сделайте проверку спустя некоторое время! И, вероятно, вам нужно проверить с некоторым указанным c экземпляром класса Bank, а не с классом Bank напрямую.

Вторая проблема заключается в том, что ваш Bank.validate метод не делает ничего полезного. Он перебирает все ключи в словаре self.accounts, но затем просто проверяет первый, чтобы увидеть, есть ли он в словаре (который всегда будет, если вы достигли этой части кода), а затем возвращает. Возможно, вы хотите, чтобы эта функция проверяла один указанный c аккаунт , а не проверяла в общем случае произвольные аккаунты. Эта учетная запись (или номер учетной записи, или что-то еще), вероятно, должна быть аргументом функции.

...