作为我脚本的一部分,我已经完成了一个深度配置类,它覆盖了所有基类型以允许额外的控制。例如,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中,但我打算让它向前兼容。
答案 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