You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:24:04