python - 将一个类标记为抽象类而不定义任何抽象方法

标签 python

我正在寻找这样的东西:

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/

相关文章:

python - 当我想存储这样复杂的数据时,如何设计models.py?

python - 在进行逻辑回归时,如何解决Python中的值错误?

python - 从随机矩阵生成样本

python - 抓取亚马逊时被阻止(即使有标题、代理、延迟)

python - 如何矢量化 3D numpy 数组中切片的阈值

python - 将 Django 模型移动到它们自己的文件中

python - 如何使用自定义 Django 后端?

python - 按列对 csv 文件进行排序

python - 检查两个相加等于 10 的整数之间是否出现三个问号

python - MATLAB 中的 Python zip 函数等效于什么?