![](/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.