python中使用_setattr_()

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-11-25 19:33:05
原创
991人浏览过
__setattr__用于控制属性赋值,每次设置属性时触发,可实现验证、只读等逻辑,需通过super().__setattr__或__dict__避免递归。

python中使用_setattr_()

在 Python 中,__setattr__ 是一个特殊方法,用于控制对象属性的赋值行为。每当尝试设置对象的某个属性时,这个方法就会被调用。通过自定义 __setattr__,你可以实现属性验证、只读属性、动态属性管理等高级功能。

基本用法

__setattr__(self, name, value) 接收三个参数:

  • self:实例本身
  • name:要设置的属性名(字符串)
  • value:要设置的属性值

每次执行 self.attr = valuesetattr(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商城系统
启科网络PHP商城系统

启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

启科网络PHP商城系统 0
查看详情 启科网络PHP商城系统

正确做法是使用父类的 __setattr__ 或操作实例的 __dict__

  • super().__setattr__('name', value)
  • self.__dict__['name'] = value

错误示例(会报 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._celsius
登录后复制

t = Temperature(25) t.celsius = 30 # 正常

t.celsius = "abc" # 抛出 TypeError

控制动态属性

有时你想禁止随意添加属性,只允许预定义的几个:

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中使用_setattr_()的详细内容,更多请关注php中文网其它相关文章!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号