@MaxMaximum

Кто поможет разобраться в классах Python?

Прохожу курс, есть задача:
Реализуйте класс MoneyBox, для работы с виртуальной копилкой.

Каждая копилка имеет ограниченную вместимость, которая выражается целым числом – количеством монет, которые можно положить в копилку. Класс должен поддерживать информацию о количестве монет в копилке, предоставлять возможность добавлять монеты в копилку и узнавать, можно ли добавить в копилку ещё какое-то количество монет, не превышая ее вместимость.

Класс должен иметь следующий вид:
class MoneyBox:
    def __init__(self, capacity):
        # конструктор с аргументом – вместимость копилки

    def can_add(self, v):
        # True, если можно добавить v монет, False иначе

    def add(self, v):
        # положить v монет в копилку

При создании копилки, число монет в ней равно 0.
Примечание:
Гарантируется, что метод add(self, v) будет вызываться только если can_add(self, v) – True.

Пока не очень понимаю это, но вот, что я написал:
class MoneyBox:
    def __init__(self, capacity):
        self.capacity = capacity
        self.sum = 0
    def can_add(self, v):
        pass
    def add(self, v):
        self.sum += v
  • Вопрос задан
  • 1115 просмотров
Пригласить эксперта
Ответы на вопрос 3
yupiter7575
@yupiter7575
Python программист
class MoneyBox:
    def __init__(self, capacity):
        self.capacity = capacity
        self.sum = 0
    def can_add(self, v):
        return self.capacity - self.sum >= v
    def add(self, v):
        if can_add(v):
             self.sum += v
Ответ написан
В питоне есть магические методы, которые позволяют, управлять сложение и прочими мат методами, и если использовать сложение то лучше пользовать ими
from dataclasses import dataclass


@dataclass
class MoneyBox:
    sum: float = 0
    capacity: float = 100

    def can_add(self, v):
        v = getattr(v, 'sum', v)
        return (self.sum + v) > self.capacity

    def __iadd__(self, v):
        if self.can_add(v):
            raise ValueError('Больше нельзя')

        if isinstance(v, MoneyBox):
            self.sum += v.sum
        elif isinstance(v, (float, int)):
            self.sum += v
        else:
            raise TypeError(f'Не поддерживается тип {type(v)}')

        return self


money_box = MoneyBox()
money_box_any = MoneyBox(10)

money_box += money_box_any

print(money_box)

money_box += 10

print(money_box)

money_box += '123'

Traceback (most recent call last):
  File "C:/Users/User/PycharmProjects/test/tmp.py", line 1, in <module>
    from a import load
  File "C:\Users\User\PycharmProjects\test\a.py", line 34, in <module>
    money_box += '123'
  File "C:\Users\User\PycharmProjects\test\a.py", line 18, in __iadd__
    raise TypeError(f'Не поддерживается тип {type(v)}')
TypeError: Не поддерживается тип <class 'str'>
MoneyBox(capacity=0, sum=10)
MoneyBox(capacity=0, sum=20)
Ответ написан
@alexbprofit
Junior SE
class MoneyBox:
  def __init__(self, capacity: int):
    self.capacity = capacity
    self.balance = 0

  def can_add(self, amount: int):
    return self.capacity - self.balance >= amount
  
  def deposit(self, cash: int):
    if cash < 0:
      print("error: invalid operation")
    else:
      self.balance += cash
  
if __name__ == "__main__":
  capital = MoneyBox(50)
  condition = 1
  while condition == 1:
    amount = int(input("Enter a amount: "))

    if capital.can_add(amount):
      capital.deposit(amount)
      print("Current balance in a capital: {}".format(capital.balance))
      condition = int(input("Enter 1 to continue, 0 to abort: "))

    else:
      print("Too large amount")
      break
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы