登录
首页 >  文章 >  python教程

Python中\_setattr\_()的使用方法

时间:2026-04-08 12:51:18 259浏览 收藏

Python 中的 `__setattr__` 是一个强大而灵活的特殊方法,它在每次为对象属性赋值时自动触发,让你能够精细控制属性设置行为——无论是实现类型验证、防止非法值(如温度低于绝对零度)、创建逻辑上的只读字段,还是限制可添加的属性范围。但需特别注意避免在方法内部直接使用 `self.attr = value`,否则将引发致命的无限递归;正确做法是通过 `super().__setattr__()` 或操作 `__dict__` 安全赋值。掌握它,你就能让类具备更健壮、更智能、更符合业务规则的数据管理能力。

python中使用_setattr_()

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

基本用法

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

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

每次执行 self.attr = valuesetattr(obj, 'attr', value) 都会触发它。

示例:

class Person:
    def __init__(self, name):
        self.name = name  # 这里也会触发 __setattr__
<pre class="brush:php;toolbar:false"><code>def __setattr__(self, name, value):
    print(f"正在设置属性: {name} = {value}")
    super().__setattr__(name, value)</code>

p = Person("Alice") p.age = 25

输出:

正在设置属性: name = Alice
正在设置属性: age = 25

防止无限递归

__setattr__ 内部直接使用 self.name = value 会导致无限递归,因为它又会调用 __setattr__

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

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

错误示例(会报 RecursionError):

<code>def __setattr__(self, name, value):
    self.name = value  # 错误!无限递归
</code>

实现属性验证或只读字段

你可以利用 __setattr__ 拦截非法赋值。

例如,限制某属性只能为特定类型:

<code>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</code>

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

t.celsius = "abc" # 抛出 TypeError

控制动态属性

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

class StrictPerson:
    __slots__ = ['name', 'age']  # 更推荐用 __slots__
<pre class="brush:php;toolbar:false"><code># 或者用 __setattr__ 实现类似效果
def __setattr__(self, name, value):
    if name not in {'name', 'age'}:
        raise AttributeError(f"不能设置属性 '{name}'")
    super().__setattr__(name, value)</code>

基本上就这些。只要记住:每次赋值都会触发它,别在内部直接赋值导致循环,用 super() 或 __dict__ 安全操作。合理使用能增强类的行为控制。

理论要掌握,实操不能落!以上关于《Python中\_setattr\_()的使用方法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>