Python 3.6:abc法类方法不检查类

2024-05-14 00:43:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3.6中,当我用一个具有metaclass=abc.ABCMeta的类用abc.abstractmethod修饰abstractmehod时,可以从类(而不是实例)的角度调用抽象方法。在

当类实例化时,abc修饰符似乎正在执行检查,因此从实例调用时不会执行检查。在

这种行为非常令人不安,看起来像是abc模块中的一个bug。在

我错过了什么?在

谢谢

代码示例:

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}")

结果:

^{pr2}$

Tags: 实例importstderrsysokpassclassmetaclass
1条回答
网友
1楼 · 发布于 2024-05-14 00:43:16

此行为与@classmethod文档中描述的行为一致。在

https://docs.python.org/3.6/library/functions.html?highlight=classmethod#classmethod

“它可以在类(如C.f())或实例(如C().f())上调用。”

在这种情况下,不能在实例上调用它,因为它是抽象的,但是由于它是一个类方法,所以直接在类上调用它还是可以的。在

相关问题 更多 >