0

所以有一个名为的类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我还在用作__metaclassfor的类中尝试了这个(直接修改代码) (当类使用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)
4

0 回答 0