Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
同时设置多个对象的属性:Python 技巧_创想鸟

同时设置多个对象的属性:Python 技巧

同时设置多个对象的属性:python 技巧

本文介绍了如何利用 Python 的特性,优雅地实现同时设置多个对象的属性。通过引入一个中间类 RegistersView,并巧妙地重载其 __setattr__ 和 __getattr__ 方法,我们可以轻松地对一组对象执行相同的属性设置操作。这种方法避免了显式的循环,提高了代码的可读性和简洁性。

在某些场景下,我们需要对多个对象进行相同的操作,例如设置属性值。如果手动循环遍历每个对象并设置属性,代码会显得冗长且不易维护。下面介绍一种利用 Python 特性来优雅地解决这个问题的方法。

首先,定义一个 Register 类,用于表示单个寄存器对象:

class Register:    def __init__(self, name, value=0):        self.name = name        self.value = value    def __repr__(self):        return str(self.value)

接下来,创建一个 RegistersView 类,该类负责管理多个 Register 对象,并提供批量设置属性的功能:

立即学习“Python免费学习笔记(深入)”;

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]

在 RegistersView 类中,__setattr__ 方法被重载。当尝试设置 RegistersView 实例的属性时,该方法会遍历其内部管理的 Register 对象列表,并将该属性值设置到每个 Register 对象上。__getattr__ 方法被重载后,会返回一个包含所有寄存器对应属性值的列表。

然后,创建一个 Memory 类,用于模拟内存,并使用 RegistersView 来实现批量属性设置的功能:

import fnmatchclass 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}"

在 Memory 类中,__getitem__ 方法被重载,用于根据寄存器 ID 获取寄存器对象。当寄存器 ID 包含通配符 * 或 ? 时,该方法会返回一个 RegistersView 实例,该实例包含了所有匹配的 Register 对象。

现在,我们可以使用以下代码来同时设置多个寄存器的属性:

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]

这段代码首先创建了一个 Memory 实例,然后通过 aMemory[“registerName*”] 获取所有名称匹配 registerName* 的寄存器对象,并将它们的 value 属性设置为 14。

注意事项:

这种方法适用于需要同时设置多个对象相同属性值的场景。RegistersView 类可以根据实际需求进行扩展,例如添加批量获取属性值的功能。在使用通配符时,需要注意性能问题,避免匹配过多的对象。

总结:

通过创建 RegistersView 类并重载 __setattr__ 方法,我们可以方便地实现同时设置多个对象的属性值。这种方法简化了代码,提高了可读性,并且可以根据实际需求进行扩展。这种技巧在处理大量相似对象时非常有用,可以显著提高开发效率。

以上就是同时设置多个对象的属性:Python 技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1364269.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何同时设置多个对象的属性
上一篇 2025年12月14日 03:55:02
同时设置多个对象的属性
下一篇 2025年12月14日 03:55:14

相关推荐

发表回复

登录后才能评论
关注微信