使用__new__后将dict传递给继承

时间:2018-04-27 16:55:06

标签: python inheritance

作为我脚本的一部分,我已经完成了一个深度配置类,它覆盖了所有基类型以允许额外的控制。例如,config['heading']['value'] = 'xyz'在设置值之前运行验证。

无论如何,我只花了最后一小时追踪一个似乎间歇性发生的错误,但事实上事实证明它一直在发生,我从来没有注意到,因为它是非常隐形的。

尽可能减少这种情况,同时仍然保持对其工作原理的一般概念。如果我传入任何内容并将其分配给cls,那么该类的任何新实例都将替换该变量。如何在cls._data之内访问_ConfigItem而不更改?{/ p>

class _ConfigItem(object):
    @property
    def data(self):
        return self._data

class _ConfigItemStr(str, _ConfigItem):
    def __new__(cls, config_dict):
        cls._data = config_dict
        return str.__new__(cls, cls._data['value'])

s1 = _ConfigItemStr({'value': 'test1'})

print(s1)
#test1
print(s1.data)
#{'value': 'test1'}

s2 = _ConfigItemStr({'value': 'test2'})

print(s1)
#test1
print(s1.data)
#{'value': 'test2'}

在这种情况下,想要的结果是s1.data仍然包含{'value': 'test1'}。请注意,这是在Python 2.7中,但我打算让它向前兼容。

1 个答案:

答案 0 :(得分:1)

看起来您希望_data成为每个实例的东西,但出于某种原因,您需要在类上设置它。在实例上设置它。

class _ConfigItem(object):
    @property
    def data(self):
        return self._data

class _ConfigItemStr(str, _ConfigItem):
    def __new__(cls, config_dict):
        obj = str.__new__(cls, config_dict['value'])
        obj._data = config_dict
        return obj

此外,您似乎不需要该属性。你可以做到

class _ConfigItemStr(str):
    def __new__(cls, config_dict):
        obj = str.__new__(cls, config_dict['value'])
        obj.data = config_dict
        return obj