簡體   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