在Python中,如何禁止类继承?

12 投票
2 回答
9868 浏览
提问于 2025-04-16 05:35

可能重复的问题:
Python 3.x中的最终类——有些事情是Guido没有告诉我的?

我在看一个讲座(如何设计一个好的API以及为什么这很重要),里面提到过一句话,字面意思是“为了继承而设计和文档,否则就禁止它”。这个讲座以Java为例,Java中有一个final关键字可以禁止子类的创建。那么在Python中,有办法禁止子类的创建吗?如果可以的话,能给个例子吗……谢谢。

2 个回答

13

在我看来,类通常不应该有任何子类化的限制。我想建议第三种选择:在你的类的文档中添加一个注释,说明这个类不打算被继承。

21

在Python中没有这样的关键词,这种做法不符合Python的风格。

一个类是否可以被继承,是由一个叫做 Py_TPFLAGS_BASETYPE 的标志来决定的,这个标志可以通过C语言的接口来设置。

当这个标志被设置时,说明这个类型可以作为其他类型的基础类型。如果这个标志没有被设置,那么这个类型就不能被继承(这有点像Java中的“final”类)。

不过,如果你愿意的话,可以仅用Python代码来模拟这种行为:

class Final(type):
    def __new__(cls, name, bases, classdict):
        for b in bases:
            if isinstance(b, Final):
                raise TypeError("type '{0}' is not an acceptable base type".format(b.__name__))
        return type.__new__(cls, name, bases, dict(classdict))

class C(metaclass=Final): pass

class D(C): pass

来源

撰写回答