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
相关产品推荐
相关产品推荐

