Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何禁止类继承?_Python - Fatal编程技术网

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

在Python中,如何禁止类继承?,python,Python,可能重复: 我在看一个演讲(),里面有这样一句话,字面意思是“为继承设计和编写文档,否则禁止它”。该演讲以Java为例,其中有“final”关键字用于禁止子类化。可以禁止Python中的子类化吗?如果是的话,最好能看到一个例子。。。 谢谢。在我看来,类通常不应该有任何子类限制。我想建议第三种选择:在类的文档中添加一条注释,说明该类不是子类 没有Python关键字-它不是Pythonic 类是否可以被子类化由一个名为的标志决定,该标志可以通过C API设置 当该类型可用作其他类型的基本类型时,设

可能重复:

我在看一个演讲(),里面有这样一句话,字面意思是“为继承设计和编写文档,否则禁止它”。该演讲以Java为例,其中有“final”关键字用于禁止子类化。可以禁止Python中的子类化吗?如果是的话,最好能看到一个例子。。。
谢谢。

在我看来,类通常不应该有任何子类限制。我想建议第三种选择:在类的文档中添加一条注释,说明该类不是子类

没有Python关键字-它不是Pythonic

类是否可以被子类化由一个名为的标志决定,该标志可以通过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

现在我只需发布几分钟前我在问相关问题时刚刚读到的链接:好的,你可以。但你不应该这样做,以免违反所有习惯用法,激怒所有Python用户。@delnan-我只是想知道我是否能做到。这可能是最好的方法。“我们都是同意的成年人”谢谢,我想这就是我想要的。另外,我也在搜索类似的问题,但没有找到任何东西,所以我发布了这个问题。我不知道在哪一版本的Python中可以使用C类的语法,但我不得不在2.5版中更改为:class C(object):metaclass=Final以使其工作。我希望人们停止使用“it's not Pythonic”作为尚未实施的事情的借口@PierreThibault:OP的答案是Python3元类语法,你的答案是Python2。