所以有一个名为的类Field
,它有类属性_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
然后这个工作。
更新
MetaField
我还在用作__metaclass
for的类中尝试了这个(直接修改代码) (当类使用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)