当前位置: 首页 > 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.gsyq.cn/news/51265.html

相关文章:

  • CPU,GPU,DSP,FPGA,ASIC
  • DeepCFD+:一种工业级 CFD 代理模型训练框架【深度学习+流体力学】 - 指南
  • 2025年11月防冻液厂家推荐榜:权威评测五强对比一览
  • steam营销分析
  • 【shell】每日shell练习:安全日志入侵检测/专业的系统配置文件合规检查
  • 2025 年 11 月旅游船厂家推荐排行榜,新能源电动旅游船,画舫仿古双层豪华旅游船,定制旅游船,玻璃钢钢质铝合金旅游船公司精选
  • 实现AI和BI整合的初步思路和探索-Part3
  • [Win] [包管理器] powershell 安装 choco
  • win11 报错
  • 本地CMake编译opencv库(Mingw)
  • 《重生之我成为世界顶级黑客》第四章:实践出真知
  • CMake+MinGW+vcpkg项目引入三方库的两种方式(手动路径,vcpkg)
  • Spring AI Alibaba 项目源码学习(八)-Flow Agent 分析
  • 详细介绍:什么是机械设备制造ERP?哲霖软件如何助力企业实现降本增效?
  • 对“机器人VCU”进行一个详细、架构的讲解。
  • 20232407 2025-2026-1 《网络与系统攻防技术》 实验五实验报告
  • 实用指南:Vue 实例生命周期
  • python多进程通信中的Queue、SimpleQueue、Pipe
  • 旧版本SiK数传的对频问题
  • 2025年加工型辣椒种子品牌前十强排行榜:镇江市镇研种业有限公司领跑行业
  • 2025年螺丝椒种子品牌综合实力排行榜前十强揭晓
  • 2025年辣椒种子品牌前十强排行榜及深度解析
  • 公司内网如何安装volta到linux
  • fastdfs版本编译升降版本
  • 增强现实(AR)在订单拣选中的应用:便捷的技术解析与中国市场前景
  • Infineon GaN 基础知识
  • 2025年国内成人自考机构推荐几家?这份权威榜单给你答案
  • PandaCoder:我的个人开发者工具进化之路
  • 2025年优质的博物馆定制展柜厂家实力及用户口碑排行榜
  • 2025年优秀的水洗墙布实力厂家TOP推荐榜