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

Flask应用调用父类属性触发AttributeError问题求助

解决AttributeError: 'LoginViewModel' object has no attribute 'name'

问题出在哪

你的LoginViewModel继承了ViewModelBase和ViewModelDataValidator,但__init__里的super调用逻辑完全错误,导致ViewModelBase的初始化代码根本没执行,自然就没有name属性。

看你这段代码:

def __init__(self):
    super(ViewModelDataValidator, self).__init__()
    super(ViewModelBase, self).__init__()
  • 第一行super(ViewModelDataValidator, self).__init__():如果ViewModelDataValidator没继承ViewModelBase,这行只会调用ViewModelDataValidator父类的构造(大概率是object),跟ViewModelBase没关系。
  • 第二行super(ViewModelBase, self).__init__():这行是调用ViewModelBase在MRO链里的下一个类的构造,也就是object,完全跳过了ViewModelBase自己的__init__,所以self.name根本没被赋值。

怎么修

有两种简单的修复方式,选一种就行:

方式1:直接调用父类构造

显式调用ViewModelBase的构造函数,确保它的代码执行:

class LoginViewModel(ViewModelBase, ViewModelDataValidator):
  
  def __init__(self):
    ViewModelBase.__init__(self)
    # 如果ViewModelDataValidator需要初始化,也加上这行
    # ViewModelDataValidator.__init__(self)
    
    self.login = self.request_dict.login.lower().strip()
    self.password = self.request_dict.password.strip()
    self.remember_login = self.request_dict.remember_login == 'on'

方式2:正确用super()

Python 3里super()会自动按MRO顺序处理父类调用,只需要一行就行:

class LoginViewModel(ViewModelBase, ViewModelDataValidator):
  
  def __init__(self):
    super().__init__()  # 自动按顺序调用ViewModelBase和ViewModelDataValidator的__init__
    
    self.login = self.request_dict.login.lower().strip()
    self.password = self.request_dict.password.strip()
    self.remember_login = self.request_dict.remember_login == 'on'

如果ViewModelDataValidator的构造需要参数,记得按需传递,或者确保它的无参构造能正常工作。

额外要检查的

  • 确认ViewModelDataValidator的构造函数不会干扰ViewModelBase的属性初始化。
  • 检查request_dict.create('')返回的对象是否正常,避免后续代码因为这个报错影响流程。

内容的提问来源于stack exchange,提问作者Bard91

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:52:08