在 Python 中,如何禁止类继承? [复制]

Posted

技术标签:

【中文标题】在 Python 中,如何禁止类继承? [复制]【英文标题】:In Python, how can I prohibit class inheritance? [duplicate] 【发布时间】:2010-10-16 12:52:48 【问题描述】:

可能重复: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 中禁止子类化?如果是的话,很高兴看到一个例子...... 谢谢。

【问题讨论】:

现在我只是必须发布我在几分钟前询问相关问题时刚刚阅读的这个链接:steve-yegge.blogspot.com/2010/07/… 好的,所以你可以。但是您不应该,以免违反所有成语并激怒所有 Python 用户。 @delnan - 我只是想知道我是否能做到。 可以使用github.com/wemake-services/final-class 【参考方案1】:

没有 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

【讨论】:

谢谢,我想这就是我想要的。另外,我正在搜索类似的问题,但找不到任何东西,所以我发布了这个问题。 我不知道您可以在哪个版本的 Python 中使用 C 类的语法,但我不得不将 2.5 版更改为:class C(object): metaclass = 最终让它发挥作用。 我希望人们停止使用“它不是 Pythonic”作为尚未实现的事物的借口。 python.org/dev/peps/pep-0591/#the-final-decorator @PierreThibault:OP 的答案是 Python 3 元类语法,你的是 Python 2。【参考方案2】:

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

【讨论】:

这是最好的方法。 “我们都是同意的成年人”

以上是关于在 Python 中,如何禁止类继承? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何允许移动构造并禁止分配和复制类的构造

当我们复制/分配派生类对象时,如何在继承中复制基类成员?

Python中没有抽象方法的抽象数据类:禁止实例化

如何从 Qt 类继承? [复制]

TypeError:禁止从 URL 继承类

我如何知道哪些类从类或接口继承? [复制]