python - Python 3.6:classmethod 上的 abc.abstracmethod 不检查类级别调用
问题描述
使用python 3.6,当我用一个类来装饰一个abstractmehod
具有的类时,可以从类(而不是实例)的角度调用抽象方法。abc.abstractmethod
metaclass=abc.ABCMeta
当类被实例化时,装饰器似乎abc
正在执行检查,所以从实例调用时没有完成。
这种行为非常令人不安,它看起来像是abc
模块中的一个错误。
我错过了什么?
谢谢
代码示例:
import abc
import sys
class P(metaclass=abc.ABCMeta):
@classmethod
@abc.abstractmethod
def acm(cls):
pass
class X(P):
pass
print("P.acm()", file=sys.stderr)
try:
P.acm()
print("OK")
except Exception as e:
print(f"KO: {e}")
print("P().acm()", file=sys.stderr)
try:
P().acm()
print("OK")
except Exception as e:
print(f"KO: {e}")
结果:
P.acm()
OK
P().acm()
KO: Can't instantiate abstract class P with abstract methods acm
解决方案
此行为与文档中描述的行为一致@classmethod
。
https://docs.python.org/3.6/library/functions.html?highlight=classmethod#classmethod
“它可以在类(例如 Cf())或实例(例如 C().f())上调用。”
在这种情况下,它不能在实例上调用,因为它是抽象的,但由于它是一个类方法,所以直接在类上调用它还是可以的。
推荐阅读
- html - 为 div 生成 CSS 模式
- python - 使用python错误导出MySQL数据库
- ruby - array_words 数组 2 中的值不正确
- python - GUI 无法打开并且不确定如何创建变量
- python - 如何从字符串中删除短语而不是单个单词
- node.js - 在 nodejs multer 模块中上传多个文件的问题
- detox - 排毒:请在您的环境构造函数中将两个参数添加到 super() 调用
- python-3.x - 掩码后如何检查列中的所有值是否为假
- php - Laravel 动态更改模式
- matlab - 用于计算新向量 a 的简单 MATLAB 函数,其中包含使 sin(a) = v 的角度