深入理解 Python Enum 的只读访问机制

admin 百科 22

深入理解 Python Enum 的只读访问机制

在 python 中,虽然通常约定使用大写变量名来表示常量,但这仅是一种惯例,语言本身并不会强制其不可变性。然而,python 的 enum(枚举)类型却能有效地阻止其成员值被覆盖或修改,从而实现严格的只读访问。这种看似矛盾的行为背后,是 python 语言中两个强大的特性在协同作用:魔术方法(magic methods)和元类(metaclasses)。

1. 魔术方法:__setattr__ 的作用

Python 提供了多种“钩子”方法,允许开发者自定义对象的行为。这些方法通常以双下划线开头和结尾(例如 __str__、__init__),因此被称为魔术方法或“dunders”(double underscores 的缩写)。

其中,__setattr__(self, name, value) 是一个特别重要的魔术方法,它在每次尝试为对象设置属性时被调用。通过重写此方法,我们可以拦截属性赋值操作,并在赋值发生之前或之后执行自定义逻辑,甚至阻止赋值。

以下是一个简单的示例,展示了如何通过 __setattr__ 监听实例属性的设置:

深入理解 Python Enum 的只读访问机制-第2张图片-佛山资讯网

from typing import Any

class Talkative:
    def __setattr__(self, name: str, value: Any) -> None:
        """
        拦截实例属性设置操作。
        """
        print(f"正在为 {self!r} 设置属性 {name!r}:{value!r}")
        # 调用父类的 __setattr__ 方法来实际设置属性
        super().__setattr__(name, value)

# 创建 Talkative 类的实例
obj = Talkative()
obj.a = "xyz"
obj.b = -1

登录后复制

输出:

标签: python idea ai 为什么 red talk

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~