0

0

如何同时设置多个对象的属性

霞舞

霞舞

发布时间:2025-07-13 16:02:24

|

336人浏览过

|

来源于php中文网

原创

如何同时设置多个对象的属性

本文介绍了一种在 Python 中使用通配符批量设置多个对象属性的方法。通过创建一个中间类 RegistersView,可以拦截属性的设置和获取操作,并将这些操作传播到一组 Register 对象上,从而实现同时修改多个寄存器值的目标。

在处理具有多个相似对象(例如寄存器)的场景时,经常需要同时修改它们的属性。如果使用循环逐个修改,代码会显得冗长且不易维护。本文提供一种优雅的解决方案,通过引入一个中间类,利用 Python 的魔术方法 __setattr__ 和 __getattr__ 拦截属性访问,实现批量设置属性的功能。

实现原理

核心思想是创建一个 RegistersView 类,该类持有一个 Register 对象列表。当通过 RegistersView 实例设置属性时,__setattr__ 方法会被调用,该方法遍历 RegistersView 内部的 Register 列表,并将属性设置应用到每个 Register 对象上。类似地,当获取属性时,__getattr__ 方法会被调用,该方法返回一个包含所有 Register 对象对应属性值的列表。

代码示例

首先,定义一个简单的 Register 类:

ShopWind网店系统
ShopWind网店系统

ShopWind网店系统是国内最专业的网店程序之一,采用ASP语言设计开发,速度快、性能好、安全性高。ShopWind网店购物系统提供性化的后台管理界面,标准的网上商店管理模式和强大的网店软件后台管理功能。ShopWind网店系统提供了灵活强大的模板机制,内置多套免费精美模板,同时可在后台任意更换,让您即刻快速建立不同的网店外观。同时您可以对网模板自定义设计,建立个性化网店形象。ShopWind网

下载
class Register:
    def __init__(self, name, value=0):
        self.name = name
        self.value = value

    def __repr__(self):
        return str(self.value)

接下来,创建 RegistersView 类:

class RegistersView:
    _registers: list[Register]

    def __init__(self, registers: list[Register]):
        self._registers = registers

    def __setattr__(self, key, value):
        if key in ["_registers"]:
            super().__setattr__(key, value)
        else:
            for r in self._registers:
                setattr(r, key, value)

    def __getattr__(self, item):
        if item in ["_registers"]:
            super().__getattribute__(item)
        else:
            return [getattr(r, item) for r in self._registers]

最后,修改 Memory 类,使其在 __getitem__ 方法中返回 RegistersView 实例:

import fnmatch

class Memory:
    _registers: dict

    def __init__(self):
        self._registers = {
            "registerName1": Register("registerName1"),
            "registerName2": Register("registerName2"),
            "registerName3": Register("registerName3"),
        }

    def __getitem__(self, registerId):
        if '*' in registerId or '?' in registerId:
            regs = list(filter(lambda register: fnmatch.fnmatch(register.name, registerId), self._registers.values()))
            return RegistersView(regs)

        return self._registers[registerId]

    def __repr__(self):
        return f"MEMO {self._registers}"

if __name__ == '__main__':
    aMemory = Memory()
    print(aMemory)
    # MEMO {'registerName1': 0, 'registerName2': 0, 'registerName3': 0}

    aRegister = aMemory["registerName1"]
    aRegister.value = 12

    allReg = aMemory["registerName*"]
    print(aMemory, allReg.value)
    # MEMO {'registerName1': 12, 'registerName2': 0, 'registerName3': 0} [12, 0, 0]

    allReg.value = 14
    print(aMemory, allReg.value)
    # MEMO {'registerName1': 14, 'registerName2': 14, 'registerName3': 14} [14, 14, 14]

使用方法

  1. 创建 Memory 实例。
  2. 使用带有通配符的键访问 Memory 实例,例如 aMemory["registerName*"]。这将返回一个 RegistersView 实例。
  3. 通过 RegistersView 实例设置属性,例如 allReg.value = 14。这将同时修改所有匹配的 Register 对象的 value 属性。

注意事项

  • RegistersView 类仅用于批量设置属性,如果需要对单个 Register 对象进行操作,可以直接通过 Memory 实例访问,例如 aMemory["registerName1"].value = 12。
  • RegistersView 类的 __getattr__ 方法返回一个列表,包含所有匹配的 Register 对象的对应属性值。在使用时需要注意处理列表。
  • 通配符匹配使用 fnmatch 模块,支持 * 和 ? 等通配符。

总结

通过引入 RegistersView 类,可以方便地实现批量设置多个对象属性的功能,避免了使用循环的繁琐。这种方法不仅简洁高效,而且提高了代码的可读性和可维护性。在处理具有多个相似对象的场景时,可以考虑使用这种方法来简化代码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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