我正在寻找这样的东西:
from abc import ABC
@abstractclass
class A(ABC):
pass
A() # FAILS
class B(A):
pass
B() # SUCCEEDS
我知道在 A
中用 abstractmethod
装饰 c'tor 或一些虚拟方法的选项,但这需要我在 中覆盖它B
。这正是我要避免的。
最佳答案
您可以自定义__new__
:
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
你也可以让它成为装饰器风格,例如像这样(只要装饰类没有自定义 __new__
就可以工作):
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
关于python - 将一个类标记为抽象类而不定义任何抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49013239/