KivyMD任务管理App出现AttributeError: 'super'无__getattr__属性问题求助
解决KivyMD任务管理App中的AttributeError问题
常见触发原因
- KV语言属性访问错误:在KV文件中误将字典当作Kivy属性访问(比如用
root.task_dict.subtask而非root.task_dict['subtask']),Kivy的属性系统会通过__getattr__查找不存在的属性,从而抛出该异常。 - 字典初始化不规范:如果关联任务与子任务的字典未在Widget的
__init__中正确初始化,或被意外覆盖为非字典类型,访问时会触发错误。 __getattr__方法重写不当:自定义Widget类中重写__getattr__时,未在无法处理属性时调用父类的对应方法。
具体修复方案
修正KV文件中的字典访问语法
确保用方括号访问字典元素,而非属性点语法:# 错误写法 MDLabel: text: root.task_subtasks.subtask1 # 正确写法 MDLabel: text: root.task_subtasks['subtask1']正确初始化关联字典
在Python代码的Widget子类__init__方法中初始化字典,避免使用Kivy属性包裹普通字典(除非需要监听字典变化):from kivymd.uix.screen import MDScreen class TaskManagerScreen(MDScreen): def __init__(self, **kwargs): super().__init__(**kwargs) # 初始化任务-子任务关联字典 self.task_subtasks = {} def add_task(self, task_id): if task_id not in self.task_subtasks: self.task_subtasks[task_id] = [] def add_subtask(self, task_id, subtask_content): if task_id in self.task_subtasks: self.task_subtasks[task_id].append(subtask_content)规范
__getattr__方法重写
如果自定义类必须重写__getattr__,需在无法处理属性时调用父类方法:def __getattr__(self, name): if name == "custom_task_prop": return self._custom_value # 交给父类处理未定义的属性 return super().__getattr__(name)添加类型校验
在操作字典前校验类型,避免意外赋值导致的类型错误:def add_subtask(self, task_id, subtask_content): assert isinstance(self.task_subtasks, dict), "task_subtasks必须为字典类型" if task_id in self.task_subtasks: self.task_subtasks[task_id].append(subtask_content)
额外排查建议
- 打印报错时的完整调用栈,定位触发错误的具体代码行。
- 逐步简化代码,移除非核心功能,定位到触发错误的逻辑模块。
内容的提问来源于stack exchange,提问作者She-Codes
相关产品推荐
相关产品推荐

