2

在 micropython 中有一个模块 neopixel 可以与 ws2812 可寻址 LED 交互,示例代码是

from microbit import *
import neopixel

pixel = neopixel.NeoPixel(pin0, 64)

pixel[0] = (255, 0, 0)
pixel.show()

这声明了由 pin0 控制的 64 个 LED,将第一个设置为红色并更新 LED 阵列。

我如何声明一个类,以便我可以像行一样分配值pixel[0] = (255, 0, 0)

4

2 回答 2

2

虽然这__setitem__是正确的,但在编码中添加 getter 和 setter 是非常常见的。

我个人建议使用 attr : http: //www.attrs.org/en/stable/examples.html

这可以实现大量的魔法,并且 setter 包含在功能中。

pip install attrs

import attr
@attr.s
class dummy():
    x= attr.ib()
test = dummy ([0])
test.x[0] = 2
test
于 2019-03-29T11:24:10.610 回答
2

您的类需要实现该__setitem__方法。

文档中:

object.__getitem__(self, key)

调用以实现对 self[key] 的评估。对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于 __getitem__() 方法。如果 key 的类型不合适,可能会引发 TypeError;如果序列的索引集之外的值(在对负值进行任何特殊解释之后),则应引发 IndexError。对于映射类型,如果缺少键(不在容器中),则应引发 KeyError。

注意:for 循环期望为非法索引引发 IndexError 以允许正确检测序列的结尾。

object.__setitem__(self, key, value)

调用以实现对 self[key] 的赋值。与 __getitem__() 的注释相同。如果对象支持更改键的值,或者可以添加新键,或者如果可以替换元素,则仅应为映射实现此功能。对于不正确的键值,应该引发与 __getitem__() 方法相同的异常。

于 2019-03-29T10:14:53.877 回答