You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类如何实现基于属性名字符串的通用setter方法

解决方案

Python内置了和getattr()对应的setattr()全局函数,刚好可以用来实现你要的通用setter功能,不需要为每个属性单独定义setter方法,也不需要硬编码属性赋值语句。

基础实现

直接修改setter方法即可,完整类代码如下:

class Employee:

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.address = "Somewhere"
        self.job = None

    def getter(self, name):
        return getattr(self, name, None)

    def setter(self, name, value):
        # 直接调用内置setattr方法完成赋值
        setattr(self, name, value)

使用示例

# 初始化实例
employee1 = Employee("李四", 24)
# 调用通用setter赋值
employee1.setter("age", 22)
employee1.setter("address", "北京市朝阳区")
employee1.setter("job", "产品经理")

# 调用getter验证结果
print(employee1.getter("age")) # 输出 22
print(employee1.getter("address")) # 输出 北京市朝阳区
print(employee1.getter("job")) # 输出 产品经理

进阶:添加属性校验

如果需要对部分属性的赋值做合法性校验,只需要在setter方法里增加对应逻辑即可,不需要修改其他代码:

def setter(self, name, value):
    # 针对特定属性增加自定义校验规则
    match name:
        case "age":
            if not isinstance(value, int) or not (16 <= value <= 65):
                raise ValueError("年龄必须是16到65之间的整数")
        case "name":
            if not isinstance(value, str) or len(value.strip()) == 0:
                raise ValueError("姓名不能为空")
    # 校验通过后再赋值
    setattr(self, name, value)

内容的提问来源于stack exchange,提问作者GrantWard101

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:12:00