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

How to adress a attribute created by setattr()?

我想为 LED 灯带创建一个 Micropython-Class。初始化时,可以使用任意数量的 color=Pin 对调用 class。 所以我的想法是调用 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 的属性(如果这有意义的话)

完整代码如下所示:

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 - 已解决

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

因为你的颜色是 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)