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