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)