当前位置: 首页 > news >正文

python类中的__setattr__

1. 基本用法

默认情况下,Python 自动处理属性赋值。但你可以重写 setattr 来拦截赋值。

class A:def __setattr__(self, name, value):super().__setattr__(name, value)

2. 必须使用 super().setattr 才能真正赋值

错误写法(会无限递归):

def __setattr__(self, name, value):self.x = value   # ❌ 再次触发 __setattr__,无限递归

正确写法:

super().__setattr__(name, value)

3. 常见用途

3.1 属性验证

class Person:def __setattr__(self, name, value):if name == "age" and value < 0:raise ValueError("age cannot be negative")super().__setattr__(name, value)

3.2 自动类型转换或格式化

class Config:def __setattr__(self, name, value):if name == "path":value = value.replace("\\", "/")super().__setattr__(name, value)

3.3 禁止动态新增属性

class Locked:allowed = {"x", "y"}def __setattr__(self, name, value):if name not in self.allowed:raise AttributeError(f"Cannot add new attribute: {name}")super().__setattr__(name, value)

3.4 记录属性赋值(日志用途)

class Monitor:def __setattr__(self, name, value):super().__setattr__(name, value)

4. 与 getattr / getattribute 的关系

方法 触发时机 说明
setattr 属性赋值时 控制 obj.x = v
getattr 找不到属性时 后备属性查找
getattribute 所有属性访问时 最底层拦截器
delattr 删除属性时 控制 del obj.x

setattr 只负责 设置,而另两个负责 获取。

5. 常见错误(必须避免)

5.1 在内部使用 self.x = ...(导致递归)

def __setattr__(self, name, value):self.x = value    # ❌ 无限递归

5.2 忘记写

super().__setattr__

导致属性根本不会被保存。

6.保存需要插入数据库的列(用这个可以避免影响这些列)

        #sampleself.name = 'a'self.attrs = copy.copy(obj._attrs)self.gui_name = 'a'

通过控制self.attrs = copy.copy(obj._attrs)的位置分割需要插数据库和不需要插数据库的属性,obj._attrs在__setattr__方法中增加需要插入数据库的列名,后续修改属性时使用super().__setattr__确保attrs不受影响。

http://www.jsqmd.com/news/41904/

相关文章:

  • 跨域问题解决方案的弃子——JSONP
  • 2025年11月智能床垫品牌TOP5推荐:服务器系统软件办公集成优化
  • CPU,GPU,DSP,FPGA,ASIC
  • 智能床垫品牌全面选品指南:2025年11月最新TOP5榜单深度解析
  • DeepCFD+:一种工业级 CFD 代理模型训练框架【深度学习+流体力学】 - 指南
  • 基于Qt实现的窗口半透明流动背景
  • 2025河南郑州锅炉设备/改造/安装/维修最新TOP5推荐:质造升级驱动产业新发展,河南中原地区优选
  • 2025年11月冷媒剂厂家推荐榜:五家主流品牌综合对比与评价
  • 2025年11月防冻液厂家推荐榜:权威评测五强对比一览
  • 2025年11月防冻液厂家对比榜:五强性能数据与资质验证全记录
  • steam营销分析
  • 2025年11月冷媒剂厂家评测榜:从资质到应用全场景解析
  • 心情助手3.07正式版,吃喝镇
  • 在ec2上部署Qwen2.5omini和Qwen3omini模型
  • 分布式计算通信原语的抽象模型
  • 【shell】每日shell练习:安全日志入侵检测/专业的系统配置文件合规检查
  • 2025年第39周数字取证与事件响应技术动态
  • 第三次算法作业
  • 2025/11/16
  • 实用指南:《vector.pdf 深度解读:vector 核心接口、扩容机制与迭代器失效解决方案》
  • 【MX-S11】梦熊 NOIP 2025 模拟赛 3 WAOI R7 FeOI R6.5(同步赛)总结分析
  • 2025 年 11 月旅游船厂家推荐排行榜,新能源电动旅游船,画舫仿古双层豪华旅游船,定制旅游船,玻璃钢钢质铝合金旅游船公司精选
  • 2025 年 11 月观光船厂家推荐排行榜,新能源观光船,电动观光船,画舫观光船,仿古观光船,双层观光船,豪华观光船,定制观光船,玻璃钢观光船,钢质观光船,铝合金观光船公司推荐
  • [Win] [ffmpeg] Win下如何安装ffmpeg
  • 开发日记
  • [Win] [包管理器] powershell 安装 choco
  • win11 报错
  • 数据结构——二十四、图(王道408) - 实践
  • 本地CMake编译opencv库(Mingw)
  • C# Avalonia 18- ControlTemplates - ColorPickerUserControlTest