python - @abstractmethod 在不应该使用 metaclass=ABCMeta 的情况下也能正常工作

标签 python abc

考虑这段代码

from abc import ABCMeta, abstractmethod

class C():
    @abstractmethod
    def my_abstract_method(self):
        print('foo')

class D(C):
    pass

x = C()
y = D()

mypy 不允许 xy 产生我 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.570python 3.6.3 进行测试

但是,文档说我需要设置 metaclass=ABCMeta 才能正常工作。我错过了什么?

最佳答案

好吧,事实证明,没有 metaclass=ABCMeta 时,只有 mypy 会捕获错误,而使用 metaclass=ABCMeta 时,mypypython 将捕获错误。

参见:

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/

相关文章:

python - 如何将数据框中的值更改为值列表?

python - Tensorflow 上的多元回归

可听写类的 Python 习语?

python - 从覆盖报告中排除抽象属性

python - 类型提示子类返回 self

python - 对数间隔值低于 1

python - 在ipython终端窗口点击生成MouseEvenT类型.MOUSE_DOWN异常

python - 生成器表达式使二进制字符串生成器永远卡住

python - 为什么 bytearray 不是 Python 2 中的序列?

python ABC和多重继承