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.