无法使用抽象方法实例化抽象 class ...
Can't instantiate abstract class ... with abstract methods
我正在开发一种库,出于一个奇怪的原因,我遇到了这个错误。
抱歉不能复制粘贴
我的依据是下面的代码有效
test.py
import abc
import six
@six.add_metaclass(abc.ABCMeta)
class Base(object):
@abc.abstractmethod
def whatever(self,):
raise NotImplementedError
class SubClass(Base):
def __init__(self,):
super(Base, self).__init__()
self.whatever()
def whatever(self,):
print("whatever")
在pythonshell
>>> from test import *
>>> s = SubClass()
whatever
为什么我的 花名册 模块出现此错误
Can't instantiate abstract class Player with abstract methods _Base__json_builder, _Base__xml_builder
提前致谢
您的问题出现是因为您在基础摘要 class 中定义了抽象方法,并在前面加上了 __
(双下划线)。这导致 python 在定义 classes 时执行 name mangling。
函数的名称从 __json_builder
更改为 _Base__json_builder
或 __xml_builder
更改为 _Base__xml_builder
。这是您必须在子 class.
中 implement/overwrite 的名称
要在您的示例中显示此行为 -
>>> import abc
>>> import six
>>> @six.add_metaclass(abc.ABCMeta)
... class Base(object):
... @abc.abstractmethod
... def __whatever(self):
... raise NotImplementedError
...
>>> class SubClass(Base):
... def __init__(self):
... super(Base, self).__init__()
... self.__whatever()
... def __whatever(self):
... print("whatever")
...
>>> a = SubClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class SubClass with abstract methods _Base__whatever
当我将实现更改为以下内容时,它起作用了
>>> class SubClass(Base):
... def __init__(self):
... super(Base, self).__init__()
... self._Base__whatever()
... def _Base__whatever(self):
... print("whatever")
...
>>> a = SubClass()
whatever
但这很繁琐,你可能要考虑一下你是否真的想用__
(双下划线)定义你的函数。您可以阅读更多关于名称修改的信息 here .
我正在开发一种库,出于一个奇怪的原因,我遇到了这个错误。
抱歉不能复制粘贴
我的依据是下面的代码有效
test.py
import abc
import six
@six.add_metaclass(abc.ABCMeta)
class Base(object):
@abc.abstractmethod
def whatever(self,):
raise NotImplementedError
class SubClass(Base):
def __init__(self,):
super(Base, self).__init__()
self.whatever()
def whatever(self,):
print("whatever")
在pythonshell
>>> from test import *
>>> s = SubClass()
whatever
为什么我的 花名册 模块出现此错误
Can't instantiate abstract class Player with abstract methods _Base__json_builder, _Base__xml_builder
提前致谢
您的问题出现是因为您在基础摘要 class 中定义了抽象方法,并在前面加上了 __
(双下划线)。这导致 python 在定义 classes 时执行 name mangling。
函数的名称从 __json_builder
更改为 _Base__json_builder
或 __xml_builder
更改为 _Base__xml_builder
。这是您必须在子 class.
要在您的示例中显示此行为 -
>>> import abc
>>> import six
>>> @six.add_metaclass(abc.ABCMeta)
... class Base(object):
... @abc.abstractmethod
... def __whatever(self):
... raise NotImplementedError
...
>>> class SubClass(Base):
... def __init__(self):
... super(Base, self).__init__()
... self.__whatever()
... def __whatever(self):
... print("whatever")
...
>>> a = SubClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class SubClass with abstract methods _Base__whatever
当我将实现更改为以下内容时,它起作用了
>>> class SubClass(Base):
... def __init__(self):
... super(Base, self).__init__()
... self._Base__whatever()
... def _Base__whatever(self):
... print("whatever")
...
>>> a = SubClass()
whatever
但这很繁琐,你可能要考虑一下你是否真的想用__
(双下划线)定义你的函数。您可以阅读更多关于名称修改的信息 here .