首页 > 解决方案 > 在基类中覆盖 __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 帖子,但到目前为止无法解决问题。

标签: pythonpython-3.x

解决方案


当您的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']})

推荐阅读