【问题标题】:Adding classes to micropython module向 micropython 模块添加类
【发布时间】:2018-06-30 04:10:09
【问题描述】:

参考adding module in micropython,我试图创建一个具有本地方法的类。在文档中给出了如何添加本地方法,并且第一个参数应该是 mp_obj_t 类型,它是数据结构本身。但是,我在问如何像其他方法一样传递额外的参数?我尝试使用 mp_obj_t * args 作为第二个参数,但 STATIC MP_DEFINE_CONST_FUN_OBJ_1 给出错误。我对STATIC MP_DEFINE_CONST_FUN_OBJ_VAR 进行了同样的尝试,但它不支持将mp_obt_t 作为第一个参数传递,因为STATIC MP_DEFINE_CONST_FUN_OBJ_VAR 需要int。我很新,所以我想问如何向可以接受参数的类添加方法?

【问题讨论】:

    标签: micropython


    【解决方案1】:

    您需要MP_DEFINE_CONST_FUN_OBJ_2,因为您有 2 个参数。 类似的东西

    STATIC mp_obj_t my_class_func(mp_obj_t self, mp_obj_t arg) {
      if (MP_OBJ_IS_SMALL_INT(lhs)) {
        const mp_int_t lhs_val = MP_OBJ_SMALL_INT_VALUE(arg);
        //...
      } else {
        //oops, not an int
      }
      return mp_const_none;
    }
    MP_DEFINE_CONST_FUN_OBJ_2(my_class_func_obj, my_class_func);
    

    此类示例的最佳来源是顺便说一句的源代码。

    【讨论】:

      【解决方案2】:

      要详细说明@stijn 答案〜创建类时,所有MP_DEFINE_CONST_FUN_OBJ_XXXXXX 定义的工作方式与您不创建类时完全相同。唯一的区别是 ACTUAL 参数的第一个参数将始终引用 self

      这是一个例子:

      mp_obj_t Class_method(mp_uint_t n_args, const mp_obj_t *args) { ... }
      

      这是标准的候选:

      MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(Class_method_obj, 1, 3, Class_method);
      

      但是,在这种情况下,args[0] 将是 self

      让我们再举一个例子。

      mp_obj_t Class_method(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { ... }
      

      这是这个定义的主要候选人

      MP_DEFINE_CONST_FUN_OBJ_KW(Class_method_obj, 2, Class_method);
      
      

      在这种情况下唯一的区别是allowed_args的第一个索引需要自动处理为self。除了现在第一个 ACTUAL 参数(即不包括n_args 或任何其他“帮助”参数)需要自动被视为self 之外,您如何做这些事情没有任何改变。话虽如此,您永远不会将MP_DEFINE_CONST_FUN_OBJ_0 与类方法一起使用。 '_0' 表示“零参数”,类方法永远不会有零参数,因为它总是至少有self。这也意味着您必须在 python 端的许多预期参数中添加一个。如果你的 python 版本接受 3 个参数 ~

      (red, green, blue)
      

      那么你的 C_MODULE 定义必须从 4 开始,因为它会得到

      (self, red, green, blue)
      

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 2018-08-16
        • 2021-11-08
        • 2016-06-24
        • 2012-01-30
        • 2017-05-31
        • 1970-01-01
        相关资源
        最近更新 更多