python - 在基类中覆盖 __setattr__ 后初始化时出现 AttributeError
问题描述
我有一个基类实现如下:
class Base:
def __init__(self):
self.attrmap = {
'x': ['gridpos', 'x']
}
def __setattr__(self, key, value):
attrmap = self.attrmap
model = self.model
while len(attrmap[key]) > 1:
model = model[attrmap[key].pop()]
model[attrmap[key].pop()] = value
以及如下实现的子类:
class Sub(Base):
def __init__(self):
super().__init__()
row_path = Path('row.json')
with open(template_path / row_path) as file:
self.model = json.load(file)
出于某种原因,当我实例化子类时
sub = Sub()
我收到以下错误消息:
AttributeError: 'Sub' object has no attribute 'attrmap'
关于为什么会发生这种情况的任何想法?我试图找到类似的 StackOverflow 帖子,但到目前为止无法解决问题。
解决方案
当您的Base.__init__
方法执行时:
self.attrmap = ...
这会触发对您的__setattr__
方法的调用;并且该方法假定self.attrmap
已经存在。
要么改变你__setattr__
的解释,要么绕过__setattr__
你的__init__
方法:
def __init__(self):
# bypass this class's __setattr__ method.
object.__setattr__(self, 'attrmap', {'x': ['gridpos', 'x']})
推荐阅读
- jquery - 关闭模式后多次加载jQuery ajax
- mysql - 多个控件字段在 node.js 应用程序中不起作用
- java - 使用 Jhipster JDL 时出现 QueryService 错误
- c# - 根据具有属性的属性复制派生类的实例
- angular - 在primeng计划中初始化后更改“validRange”属性
- ruby - 我刚刚回到过去
- node.js - 无法使用反应功能调用 express app.post
- python-2.7 - 如何使用 Robotframework 自动化 iframe 中的文本字段
- reactjs - 子组件看不到父组件状态更新
- windows - 将 __int64 转换为 FileTime