![](/img/trans.png)
[英]How to call a parent class's @classmethod from an overridden @classmethod in Python?
[英]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.