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

时间:2010-10-16 12:52:48

标签: python

  

可能重复:
  Final classes in Python 3.x- something Guido isn't telling me?

我正在观看一个谈话(How to design a good API and why it matters),据说字面意思是“继承的设计和文档,否则禁止它”。谈话以Java为例,其中有“ final ”关键字禁止子类化。是否可以在Python中禁止子类化?如果是的话,看到一个例子真是太好了...... 感谢。

2 个答案:

答案 0 :(得分:10)

没有Python关键字 - 它不是Pythonic。

是否可以对类进行子类化由一个名为Py_TPFLAGS_BASETYPE的标志决定,该标志可以通过C API设置。

  

当类型可以用作另一种类型的基本类型时,设置此位。如果该位清零,则不能对类型进行子类型化(类似于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

Source

答案 1 :(得分:8)

在我看来,类通常根本不应该有任何子类限制。我想建议第三个选项:在类的文档中添加一条注释,指出该类不应该是子类。