Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3.6:abc.abstracmethod on classmethod不检查类级调用_Python_Abstract Class_Class Method_Abstract Methods - Fatal编程技术网

Python3.6:abc.abstracmethod on classmethod不检查类级调用

Python3.6:abc.abstracmethod on classmethod不检查类级调用,python,abstract-class,class-method,abstract-methods,Python,Abstract Class,Class Method,Abstract Methods,在Python3.6中,当我用abc.abstractmethod来修饰abstractmethod时,使用一个具有metaclass=abc.ABCMeta的类,可以从类(而不是实例)的角度调用抽象方法 当类被实例化时,abc装饰程序似乎正在执行检查,因此从实例调用时没有执行检查 这种行为非常令人不安,看起来像是abc模块中的一个bug 我错过了什么 谢谢 代码示例: import abc import sys class P(metaclass=abc.ABCMeta): @cla

在Python3.6中,当我用
abc.abstractmethod
来修饰
abstractmethod
时,使用一个具有
metaclass=abc.ABCMeta
的类,可以从类(而不是实例)的角度调用抽象方法

当类被实例化时,
abc
装饰程序似乎正在执行检查,因此从实例调用时没有执行检查

这种行为非常令人不安,看起来像是
abc
模块中的一个bug

我错过了什么

谢谢

代码示例:

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
文档中描述的行为一致

“可以在类(如C.f())或实例(如C().f())上调用它。”


在这种情况下,不能在实例上调用它,因为它是抽象的,但由于它是一个classmethod,所以直接在类上调用它仍然可以。

产生了一个python问题。再见,谢谢。我把抽象方法的概念从java转过来,这是不等价的。