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

在python 3.6中,当我使用abstractmehodwith来装饰一个withabc.abstractmethod的类时metaclass=abc.ABCMeta,可以从类(而非实例)的角度调用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


潇湘沐
浏览 165回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python