Python 将类标记为抽象类,而不定义任何抽象方法

Python 将类标记为抽象类,而不定义任何抽象方法,python,Python,我在找这样的东西: from abc import ABC @abstractclass class A(ABC): pass A() # FAILS class B(A): pass B() # SUCCEEDS 我知道可以选择在A中用abstractmethod来修饰c'tor或一些伪方法,但这需要我在B中重写它。这正是我想要避免的。您可以自定义\uuu new\uuu: from abc import ABC, abstractmethod class A(

我在找这样的东西:

from abc import ABC

@abstractclass
class A(ABC):
    pass

A()  # FAILS

class B(A):
    pass

B()  # SUCCEEDS

我知道可以选择在
A
中用
abstractmethod
来修饰c'tor或一些伪方法,但这需要我在
B
中重写它。这正是我想要避免的。

您可以自定义
\uuu new\uuu

from abc import ABC, abstractmethod

class A(ABC):
    def __new__(cls):
        if cls is A:
            raise TypeError("Can't instantiate abstract class {}".format(A.__name__))
        return super(A, cls).__new__(cls)

class B(A):
    pass

A()  # TypeError
B()  # Ok
def abstractclass(decorated_cls):
    def clsnew(cls):
        if cls is decorated_cls:
            raise TypeError("Can't instantiate abstract class {}".format(decorated_cls.__name__))
        return super(decorated_cls, cls).__new__(cls)
    decorated_cls.__new__ = clsnew
    return decorated_cls

@abstractclass
class A(ABC):
    pass

class B(A):
    pass

A()  # TypeError
B()  # Ok
您还可以将其设置为decorator样式,例如如下所示(只要装饰类没有自定义
\uuuu new\uuuu
):


为什么要这样做?abc的要点是要求所有抽象方法都在派生类中定义。如果你没有任何抽象的方法,那么这些方法的“全部”都被定义了,首先使用abc是没有意义的。将类定义为抽象类是有语义上的原因的,即使该类可以在语法上完全实现。@wim从抽象mixin继承的类可以实现其所有方法,但仍保留一些未定义的属性。为此,搜索了很多。不错+1.