【问题标题】:How do i declare my class so i can access like this我如何声明我的班级,以便我可以这样访问
【发布时间】:2019-03-29 10:06:35
【问题描述】:

在 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) 这样的行分配值?

【问题讨论】:

    标签: python python-3.x micropython bbc-microbit


    【解决方案1】:

    虽然__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
    

    【讨论】:

    • 我认为提问者正在使用 MicroPython,在这种情况下(我认为)attrs 并不容易获得。 Thisthis 可能是相关的。
    【解决方案2】:

    您的类需要实现__setitem__ 方法。

    来自documentation

    object.__getitem__(self, key)

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

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

    object.__setitem__(self, key, value)

    调用以实现分配到 自我[键]。与 __getitem__() 的注释相同。这应该只是 如果对象支持对值的更改,则为映射实现 对于键,或者是否可以添加新键,或者对于序列,如果元素 可以更换。对于不正确的密钥,应引发相同的异常 __getitem__() 方法的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多