在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}$
此行为与
@classmethod
文档中描述的行为一致。在https://docs.python.org/3.6/library/functions.html?highlight=classmethod#classmethod
“它可以在类(如C.f())或实例(如C().f())上调用。”
在这种情况下,不能在实例上调用它,因为它是抽象的,但是由于它是一个类方法,所以直接在类上调用它还是可以的。在
相关问题 更多 >
编程相关推荐