\`final\` 关键字等同于 Python 中的变量?

新手上路,请多包涵

我在 Python 中找不到与 Java 的 final 等价的文档,有这样的东西吗?

我正在创建一个对象的快照(用于在任何失败时恢复);一旦分配了这个备份变量,它就不应该被修改——Python 中的一个类似 final 的特性会很好地做到这一点。

原文由 Jason Coon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 755
2 个回答

在 Java 中有一个变量是 final 基本上意味着一旦你分配给一个变量,你就不能重新分配该变量以指向另一个对象。这实际上并不意味着该对象不能被修改。例如,下面的 Java 代码运行得非常好:

 public final List<String> messages = new LinkedList<String>();

public void addMessage()
{
    messages.add("Hello World!");  // this mutates the messages list
}

但以下甚至无法编译:

 public final List<String> messages = new LinkedList<String>();

public void changeMessages()
{
    messages = new ArrayList<String>();  // can't change a final variable
}

所以你的问题是关于 final 是否存在于 Python 中。它不是。

然而,Python 确实有不可变的数据结构。例如,虽然您可以改变 a list ,但不能改变 a tuple 。您可以改变 set 但不能改变 frozenset 等。

我的建议是不要担心在语言级别强制执行非突变,而只需专注于确保您不编写任何在分配这些对象后改变这些对象的代码。

原文由 Eli Courtwright 发布,翻译遵循 CC BY-SA 2.5 许可协议

Python 中没有 final 等价物。

但是,要创建类实例的只读字段,您可以使用 属性 函数。

编辑:也许你想要这样的东西:

 class WriteOnceReadWhenever:
    def __setattr__(self, attr, value):
        if hasattr(self, attr):
            raise Exception("Attempting to alter read-only value")

        self.__dict__[attr] = value

多年后编辑:正如 Cerno 提到的,从 Python 3.8 开始,有 @typing.final 。请注意,没有运行时检查此属性。

原文由 Stephan202 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题