如何处理由 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 设置对象的属性值,如果属性不存在就创建一个