繁体   English   中英

Python 3.6:classmethod上的abc.abstracmethod在类级调用上不检查

[英]Python 3.6: abc.abstracmethod on classmethod no check on class level call

在python 3.6中,当我使用具有metaclass=abc.ABCMeta的类来用abc.abstractmethod装饰abstractmehod时,可以从类(而非实例)的角度调用abstract方法。

实例化类时,似乎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())上调用它。”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM