41

有没有办法使类函数不可覆盖?类似于 java 的final关键字。即,任何重写类都不能重写该方法。

4

4 回答 4

153

您可以在其中发表评论,大意是:

# We'll fire you if you override this method.

令人惊讶的是,像这样的低技术解决方案在实践中的效果如何。

于 2010-03-11T14:42:08.173 回答
46

问题是您正在尝试使用 Java 哲学在 Python 中编写代码。有些东西会延续,但不是全部。在 Python 中,您可以执行以下操作,这非常好,但完全违背了 Java 对对象的看法。

class Thing(object):
    x = 1
something = Thing()
something.y = something.x

如果你真的想要它,你可以试试这里发布的代码。但是正如你所看到的,那里有很多代码可以让它做你想做的事。还应该注意的是,即使发布代码的人也说它可以通过使用__dict__or传递object.__setattr__

于 2010-03-11T14:39:01.160 回答
1

在类中的方法前使用双下划线不仅仅是一种命名约定。通过这样做,方法名称与classname(_classname__methodname()).

通过继承具有前面有双下划线的方法的类;对于子类,很难覆盖上述指定的方法。这种做法几乎等同于java中的final。

于 2018-08-16T14:33:20.727 回答
-1

是的,有,不要这样做。

我应该在否决票后补充这一点。这种保护机制被一些人认为违背了 Python 的精神,即“我们在这里都是同意的成年人”。你想保护这些功能免受谁的侵害?如果评论还不够,为什么会有“更强”的东西?

我会记录您的期望并期望其他程序员采取负责任的行动。

于 2010-03-11T21:03:34.863 回答