Python中变量的“final”关键字等效?

2022-08-31 12:27:48

我在Python中找不到与Java等效的文档,有这样的事情吗?final

我正在创建对象的快照(用于在发生任何故障时进行还原);一旦分配了这个备份变量,它就不应该被修改 - Python中的最终功能会很好。


答案 1

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

答案 2

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

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
}

所以你的问题是关于Python中是否存在。事实并非如此。final

但是,Python确实具有不可变的数据结构。例如,虽然您可以改变 一个 ,但不能改变 一个 .您可以改变 a,但不能变异 a 等。listtuplesetfrozenset

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