Python继承问题:如何让Category子类实例复用已输入的username避免重复请求
问题本质
你遇到的重复输入问题核心原因是Category继承Budget后,每次实例化Category调用super().__init__()时,都会重新执行Budget初始化逻辑里的User.get_user()触发输入,而你其实需要复用的是已经初始化完成的Budget实例的属性,不是每次都新建一个Budget实例。另外你原代码里Budget的__init__参数monthtly_income拼写错误,少了一个n,后续可统一修正为monthly_income避免报错。
修复方案
方案一:组合设计(推荐)
避免滥用继承,Category不需要是Budget的子类,而是将已经初始化完成的Budget实例传入Category,直接复用已有属性,用户名仅会在第一次创建Budget时输入一次。
class User: def __init__(self, username): self.username = username @classmethod def get_user(cls): return cls(input("Username: ")) class Budget(User): def __init__(self, monthly_income): # 仅第一次创建Budget实例时触发一次用户名输入 super().__init__(User.get_user()) self.monthly_income = monthly_income self.perc_lis = [] self.category_obj_lis = [] self.category_name_lis = [] self.value_lis = [] def init_categories(self): for name in self.category_name_lis: # 将已初始化完成的当前Budget实例传入Category self.category_obj_lis.append(Category(name, self)) # Category不再继承Budget,改为接收Budget实例复用属性 class Category: def __init__(self, name, budget): self.name = name # 直接复用Budget的已有属性,无额外输入逻辑 self.monthly_income = budget.monthly_income self.username = budget.username self.perc = 0 self.amt = 0 self.left = 0 self.max = 0 def get_perc(self): self.perc = float(input(f"{self.name}: "))
方案二:保留继承关系的修改
如果必须保留Category继承Budget的结构,可以给Budget的初始化方法加开关控制是否触发用户输入逻辑。
class User: def __init__(self, username): self.username = username @classmethod def get_user(cls): return cls(input("Username: ")) class Budget(User): # 新增init_user参数控制是否触发用户名输入 def __init__(self, monthly_income, init_user=True): if init_user: super().__init__(User.get_user()) self.monthly_income = monthly_income self.perc_lis = [] self.category_obj_lis = [] self.category_name_lis = [] self.value_lis = [] def init_categories(self): for name in self.category_name_lis: self.category_obj_lis.append(Category(name, self.monthly_income)) class Category(Budget): def __init__(self, name, monthly_income): # 传入init_user=False跳过用户名输入逻辑 super().__init__(monthly_income, init_user=False) self.name = name self.perc = 0 self.amt = 0 self.left = 0 self.max = 0 def get_perc(self): self.perc = float(input(f"{self.name}: "))
内容的提问来源于stack exchange,提问作者whm33
相关产品推荐
相关产品推荐

