它发生在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的问题......?