Как сделать так, чтобы каждый экземпляр дочернего класса не требовал родительских атрибутов (типа?)

#python #inheritance

Вопрос:

 class User:  def __init__(self, username):  self.username = username   @classmethod  def get_user(cls):  return cls(input("Username: "))    class Budget(User):  def __init__(self, monthtly_income):  super().__init__(User.get_user())  self.monthly_income = monthtly_income  self.perc_lis = []  self.category_obj_lis = []  self.category_name_lis = []  self.value_lis = [] ... # creates objects and adds them to a list  for i in range(len(self.category_name_lis)):  self.category_obj_lis.append("")  self.category_obj_lis[i] = Category(self.category_name_lis[i], self.monthly_income)  ...  class Category(Budget):  def __init__(self, name, monthly_income):  super().__init__(monthly_income)  self.name = name  self.perc = 0  self.amt = 0  self.left = 0  self.max = 0   # defines the percentage for each category  def get_perc(self):  self.perc = float(input(f"{self.name}: "))  

Когда я запускаю это, он запрашивает имя пользователя 3 раза после того, как я запросил категории, потому что я создаю каждый объект категории в цикле. Имя пользователя запрашивается в начале кода. Мне нужно, чтобы класс категории был дочерним классом, потому что мне нужна переменная monthly_income для использования в коде, который не опубликован. Я не очень хорошо разбираюсь в наследовании, поэтому легко могу упустить что-то очевидное. Есть ли способ для каждого экземпляра категории не запрашивать имя пользователя и просто использовать то, которое уже было задано в начале? Я прошу прощения, если это несколько сбивает с толку, но я знаю, куда идти дальше.

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

1. Делая шаг назад: это плохая идея-смешивать проблемы ввода/вывода с методами ваших классов. Держите это вне их, в основной программе: прочитайте необходимые вам входные данные, а затем создайте экземпляр(ы), передав эту предоставленную пользователем информацию в качестве аргумента.

2. Наследование представляет собой связь между классами. Бюджет-это не пользователь, а категория-это не бюджет. Это не должны быть подклассы.

3. @trincot Это выглядит как допустимый вариант использования метода класса. Я бы согласился, если бы звонок input был внутри __init__ .

4. не рекомендуется использовать input() внутри класса — лучше сначала использовать input() запрос имени только один раз, а затем создать User(username) и отправить это имя всем созданным Category(username)