__setattr__用于控制属性赋值,每次设置属性时触发,可实现验证、只读等逻辑,需通过super().__setattr__或__dict__避免递归。

在 Python 中,__setattr__ 是一个特殊方法,用于控制对象属性的赋值行为。每当尝试设置对象的某个属性时,这个方法就会被调用。通过自定义 __setattr__,你可以实现属性验证、只读属性、动态属性管理等高级功能。
__setattr__(self, name, value) 接收三个参数:
每次执行 self.attr = value 或 setattr(obj, 'attr', value) 都会触发它。
示例:
立即学习“Python免费学习笔记(深入)”;
class Person:
def __init__(self, name):
self.name = name # 这里也会触发 __setattr__
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">def __setattr__(self, name, value):
print(f"正在设置属性: {name} = {value}")
super().__setattr__(name, value)p = Person("Alice") p.age = 25
输出:
正在设置属性: name = Alice 正在设置属性: age = 25
在 __setattr__ 内部直接使用 self.name = value 会导致无限递归,因为它又会调用 __setattr__。
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
0
正确做法是使用父类的 __setattr__ 或操作实例的 __dict__:
错误示例(会报 RecursionError):
<pre class="brush:php;toolbar:false;">def __setattr__(self, name, value):
self.name = value # 错误!无限递归
你可以利用 __setattr__ 拦截非法赋值。
例如,限制某属性只能为特定类型:
<pre class="brush:php;toolbar:false;">class Temperature:
def __init__(self, celsius):
self._celsius = celsius
<pre class="brush:php;toolbar:false;"><code>def __setattr__(self, name, value):
if name == "celsius":
if not isinstance(value, (int, float)):
raise TypeError("温度必须是数字")
if value < -273.15:
raise ValueError("温度不能低于绝对零度")
super().__setattr__("_celsius", value)
else:
super().__setattr__(name, value)
@property
def celsius(self):
return self._celsiust = Temperature(25) t.celsius = 30 # 正常
有时你想禁止随意添加属性,只允许预定义的几个:
class StrictPerson:
__slots__ = ['name', 'age'] # 更推荐用 __slots__
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"># 或者用 __setattr__ 实现类似效果
def __setattr__(self, name, value):
if name not in {'name', 'age'}:
raise AttributeError(f"不能设置属性 '{name}'")
super().__setattr__(name, value)基本上就这些。只要记住:每次赋值都会触发它,别在内部直接赋值导致循环,用 super() 或 __dict__ 安全操作。合理使用能增强类的行为控制。
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号