考虑这段代码
from abc import ABCMeta, abstractmethod
class C():
@abstractmethod
def my_abstract_method(self):
print('foo')
class D(C):
pass
x = C()
y = D()
mypy 不允许 x
和 y
产生我 a
test.py:13: error: Cannot instantiate abstract class 'C' with abstract attribute 'my_abstract_method'
test.py:15: error: Cannot instantiate abstract class 'D' with abstract attribute 'my_abstract_method'
我正在使用 mypy 0.570
和 python 3.6.3
进行测试
但是,文档说我需要设置 metaclass=ABCMeta
才能正常工作。我错过了什么?
最佳答案
好吧,事实证明,没有 metaclass=ABCMeta
时,只有 mypy
会捕获错误,而使用 metaclass=ABCMeta
时,mypy
和 python
将捕获错误。
参见:
from abc import abstractmethod
class C():
@abstractmethod
def my_abstract_method(self):
print('foo')
class D(C):
pass
x = C()
y = D()
$ mypy test.py
test.py:13: error: Cannot instantiate abstract class 'C' with abstract attribute 'my_abstract_method'
test.py:15: error: Cannot instantiate abstract class 'D' with abstract attribute 'my_abstract_method'
但是
$ python3 test.py
$
然而,python
也会捕获错误。
from abc import ABCMeta, abstractmethod
class C(metaclass=ABCMeta):
@abstractmethod
def my_abstract_method(self):
print('foo')
class D(C):
pass
x = C()
y = D()
$ python3 test.py
Traceback (most recent call last):
File "test.py", line 11, in <module>
x = C()
TypeError: Can't instantiate abstract class C with abstract methods my_abstract_method
关于python - @abstractmethod 在不应该使用 metaclass=ABCMeta 的情况下也能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49297254/