可能重复:
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中禁止子类化?如果是的话,看到一个例子真是太好了...... 感谢。
答案 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
答案 1 :(得分:8)
在我看来,类通常根本不应该有任何子类限制。我想建议第三个选项:在类的文档中添加一条注释,指出该类不应该是子类。