我在 Python 中找不到与 Java 的 final
等价的文档,有这样的东西吗?
我正在创建一个对象的快照(用于在任何失败时恢复);一旦分配了这个备份变量,它就不应该被修改——Python 中的一个类似 final 的特性会很好地做到这一点。
原文由 Jason Coon 发布,翻译遵循 CC BY-SA 4.0 许可协议
我在 Python 中找不到与 Java 的 final
等价的文档,有这样的东西吗?
我正在创建一个对象的快照(用于在任何失败时恢复);一旦分配了这个备份变量,它就不应该被修改——Python 中的一个类似 final 的特性会很好地做到这一点。
原文由 Jason Coon 发布,翻译遵循 CC BY-SA 4.0 许可协议
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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
在 Java 中有一个变量是
final
基本上意味着一旦你分配给一个变量,你就不能重新分配该变量以指向另一个对象。这实际上并不意味着该对象不能被修改。例如,下面的 Java 代码运行得非常好:但以下甚至无法编译:
所以你的问题是关于
final
是否存在于 Python 中。它不是。然而,Python 确实有不可变的数据结构。例如,虽然您可以改变 a
list
,但不能改变 atuple
。您可以改变set
但不能改变frozenset
等。我的建议是不要担心在语言级别强制执行非突变,而只需专注于确保您不编写任何在分配这些对象后改变这些对象的代码。