为什么我创建实现MutableMapping接口的类B的子类A,IDE仍然要求我在Python 3中实现所有抽象方法?

时间:2015-10-01 21:52:12

标签: python python-3.x override abstract-class pycharm

它发生在Python3.4和Pycharm4.5.4中。

我想为我的项目创建一个类似ORM的API。

所以我写了一个元类和一个基类。基类实现了MutableMapping接口,使api像dict一样。

但是当我创建基类的子类时,我收到IDE的警告:

  

class Item必须实现所有抽象方法

我错过了什么?

以下是代码:

class Field(object):
    pass


class ItemMeta(ABCMeta):
    if cls_name == 'Item':
        super(ItemMeta, mcs).__new__(mcs, cls_name, bases, attrs)

    fields = {}
    for k, v in attrs.items():
        if isinstance(v, Field):
            fields[k] = v

    for k in fields:
        attrs.pop(k)

    attrs['fields'] = fields
    return super(ItemMeta, mcs).__new__(mcs, cls_name, bases, attrs)


class DictItem(MutableMapping):

    fields = {}

    def __init__(self, *args, **kwargs):
        self._values = {}
        if args or kwargs:
            for k, v in dict(*args, **kwargs).items():
                self[k] = v

    def __getitem__(self, key):
        return self._values[key]

    def __setitem__(self, key, value):
        if key in self.fields:
            self._values[key] = value
        else:
            raise KeyError('%s not support field: %s' % (self.__class__.__name__, key))

    def __delitem__(self, key):
        del self._values[key]

    def __getattr__(self, name):
        if name in self.fields:
            raise AttributeError("Use item[%r] to get value" % name)
        raise AttributeError(name)

    def __setattr__(self, name, value):
        if not name.startswith('_'):
            raise AttributeError("Use item[%r] = %r to set value" % (name, value))
        super(DictItem, self).__setattr__(name, value)

    def __len__(self):
        return len(self._values)

    def __iter__(self):
        return iter(self._values)

    def keys(self):
        return self._values.keys()

    def copy(self):
        return self.__class__(self)

    def __contains__(self, key):
        return key in self._values


class Item(DictItem, metaclass=ItemMeta):
    pass

编辑: 来自IDE的警告是在“类别项目”中。行

我已经更改了我的代码,现在它可以正常运行。

但警告仍然存在。

所以现在我认为这是Pycharm的问题......?

0 个答案:

没有答案