0

したがって、というクラスがありField、それには class 属性_slotsがあり、この属性はディクショナリです。

したがって、次のようになります (そのクラスも custom を使用します__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}

(他のpythonファイル)

import f

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

f_new = f.F()
print f_new._t

次に、これが機能します。

アップデート

また、 forMetaFieldとして使用されるクラスでこれを(コードを直接変更して)試しました(クラスが使用する場合は無視されます:__metaclassFieldField_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)
4

0 に答える 0