如何处理由 setattr() 创建的属性?

Posted

技术标签:

【中文标题】如何处理由 setattr() 创建的属性?【英文标题】:How to adress a attribute created by setattr()? 【发布时间】:2022-01-16 13:19:57 【问题描述】:

我想为 LED 灯条创建一个 Micropython 类。初始化时,可以使用任意数量的 color=Pin 对调用该类。 所以我的想法是打电话给def __init__(self, **kwargs),然后使用:

for color, pin in kwargs.items():
    setattr(self, color, PWM(Pin(pin)))

我想稍后参考(例如,用self.color.duty() 更改 PWM 值。我的问题是,我不知道如何创建所有已创建属性的任何类型的列表,所以我可以稍后遍历它们在。 考虑类似的事情:

for color in color_list:
    color.duty(number_gained_via_mqtt)

但是我怎样才能把创建的属性放到这个“color_list”中呢?

更新

感谢您的第一个答案!问题是,一个简单的键列表并不能解决我的问题。我不能调用 self.key_from_list(据我所知)。

例如如果我从键 color_list=["r","g","b","w"]创建一个列表,我不能(或不知道如何)遍历它们。

for color in color_list:
    self.color.duty(0)

不起作用,因为列表只包含字符串,我不知道如何使用该名称调用我的类的属性(如果这有意义的话)

完整的代码如下所示:

class Stripe():
    def __init__(self, **kwargs):
        self.on = 1
        self.leds = dict()
        for key, value in kwargs.items():
            setattr(self, key, PWM(Pin(value)))
            self.leds[key] = 255
    
    def display(self):
        if self.on:
            for key in self.leds:
                self.key.duty(self.leds.get(key)) # does not work
        else:
            for key in self.leds:
                 self.key.duty(0) # does not work either

更新 2 - 已解决

谢谢大家的回答。使用字典而不是属性可以解决问题。

【问题讨论】:

你能提供一个更具体的例子吗? list(kwargs.keys()) 你考虑过用字典代替属性吗? 当然不行,key是一个字符串对象,使用self.key不会神奇地转化为执行代码self.the_string。你似乎明白你可以使用setattr,所以在这种情况下,你会使用getattr,即getattr(self, key).duty(self.leds.get(key)) 【参考方案1】:

由于您的颜色是kwargs 的键,这是一个常规字典,您可以这样做

self.color_list = list(kwargs.keys())

然后你可以将它们称为

for color in self.color_list:
    getattr(self, color).duty(number_gained_via_mqtt)

如果您只需要 PWM 对象的列表,您也可以这样做:

self.color_list = []
for color, pin in kwargs.items():
    pwm = PWM(Pin(pin))
    setattr(self, color, pwm)
    self.color_list.append(pwm)

那你就可以了

for color in self.color_list:
    color.duty(number_gained_via_mqtt)

更好的选择可能是将所有内容存储到字典而不是实例__dict__ 中,其中所有属性都混合在一起:

self.colors = color: PWM(Pin(pin)) for color, pin kwargs.items()

然后你可以更简单地访问它:

for pin in self.colors.values():
    pin.duty(number_gained_via_mqtt)

【讨论】:

这绝对是解决我问题的好方法。谢谢! (我仍然想知道是否有任何方法可以像我尝试的那样处理属性,但至少我的代码现在可以工作

以上是关于如何处理由 setattr() 创建的属性?的主要内容,如果未能解决你的问题,请参考以下文章

Python3基础 setattr 设置对象的属性值,如果属性不存在就创建一个

setattr

如何处理由上传有问题的 JPEG 引起的错误?

如何处理由于分组函数而导致的 JDBC 数字类型的精度损失

如何处理由于从 Firestore DB 检索而多次运行的 UseEffect?

如何处理由 MLlib 生成的 Spark ALS 模型中的新用户/项目?