Python - обновление атрибута класса (исправление обезьян?)

Так что есть класс под названием Field и у него есть атрибут класса _slotsэтот атрибут словарь.

Так это выглядит так (этот класс также использует пользовательские __metaclass__):

class Field(object):

  _slots = {
    'key1': False,
    'key2': None,
    ...
}

Содержание класса слишком велико, чтобы его можно было вставить здесь, поэтому я предоставляю ссылку на него, src

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

Итак, я попробовал это (в моем собственном модуле):

from openerp import fields

fields.Field._slots['custom_key'] = None

Когда я печатаю после этого присваивания, он показывает, что я установил эту пару ключ / значение, но на самом деле, когда этот класс загружен, он никогда не получает мой custom_key, Хотя, если я исправлю какой-то метод, он работает, но для атрибута класса - нет. Возможно ли вообще это сделать (или я здесь что-то не так делаю?)?

Хотя, если я напишу простой тестовый сценарий со своим собственным простым классом, например:

(файл f.py)

class F(object):
    _t = {'a': 1}

(другой файл питона)

import f

f.F._t['b'] = 10

f_new = f.F()
print f_new._t

Тогда этот работает.

Обновить

Я также попробовал это (изменение кода напрямую) в MetaField класс, который используется как __metaclass за Field (все еще это игнорируется, когда Field класс использует _slots:

def __new__(meta, name, bases, attrs):
    """ Combine the ``_slots`` dict from parent classes, and determine
    ``__slots__`` for them on the new class.
    """
    base_slots = {}
    for base in reversed(bases):
        base_slots.update(getattr(base, '_slots', ()))

    slots = dict(base_slots)
    slots.update(attrs.get('_slots', ()))

    attrs['__slots__'] = set(slots) - set(base_slots)
    attrs['_slots'] = slots
    attrs['_slots']['custom_key'] = None  # <= Modification here
    return type.__new__(meta, name, bases, attrs)

0 ответов

Другие вопросы по тегам