【发布时间】: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))
标签: python class oop micropython