Передайте dict в наследство после использования __new__ - PullRequest
0 голосов
/ 27 апреля 2018

Как часть моего скрипта, я создал класс конфигурации, который переопределяет все базовые типы, чтобы обеспечить дополнительный контроль. Например, config['heading']['value'] = 'xyz' выполняет проверку перед установкой значения.

Во всяком случае, я только что провел последний час, отслеживая ошибку, которая, казалось, происходила с перерывами, но на самом деле оказывается, что это происходит постоянно, и я просто никогда не замечал, что она довольно невидима.

Это максимально урезано, сохраняя общее представление о том, как это работает. Если я передам что-нибудь и назначу это cls, то любой новый экземпляр класса заменит переменную. Как я могу получить доступ к cls._data из _ConfigItem без его изменения?

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 голосов
/ 27 апреля 2018

Похоже, вы хотите, чтобы _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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...