小编Min*_*Max的帖子

元类的“__init_subclass__”方法在这个元类构造的类中不起作用

我的问题受到了这个问题的启发。

问题在于 3 级类模型 - 终止类(3 级)仅应存储在注册表中,但 2 级是干扰性的并且也已存储,因为它们是 1 级的子类。

我想通过使用元类摆脱 1 级类。通过这种方式,只剩下 2 个类级别 - 每组设置及其子项的基类 - 从相应的基类继承的各种设置类。元类用作类工厂 - 它应该创建具有所需方法的基类,并且不应显示在继承树中。

但我的想法行不通,因为似乎__init_subclass__方法(方法的链接)没有从元类复制到构造类。与__init__方法相反,这符合我的预期。

代码片段?1、模型的基本框架:

class Meta_Parent(type):
    pass

class Parent_One(metaclass=Meta_Parent):
    pass

class Child_A(Parent_One):
    pass

class Child_B(Parent_One):
    pass

class Child_C(Parent_One):
    pass

print(Parent_One.__subclasses__())
Run Code Online (Sandbox Code Playgroud)

输出:

[<class '__main__.Child_A'>, <class '__main__.Child_B'>, <class '__main__.Child_C'>]
Run Code Online (Sandbox Code Playgroud)

我想为上述模型的子类化过程添加功能,所以我重新定义了type's 的内置函数__init_subclass__

代码片段?2.

class Meta_Parent(type):
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        print(cls)
Run Code Online (Sandbox Code Playgroud)

从我的角度来看,现在每个由Meta_Parent元类(例如,Parent_One)构造的新类都应该有__init_subclass__方法,因此,当每个类都从这个新类继承时,应该打印子类名称,但它什么也不打印。也就是说,__init_subclass__当继承发生时我的方法不会被调用。

如果Meta_Parent元类是直接继承的,它就可以工作:

代码片段?3. …

metaclass python-3.x

4
推荐指数
1
解决办法
822
查看次数

argv、envp、argc(命令行参数)的最大汇总大小总是远离 ARG_MAX 限制

我写了一个程序来计算传递给execve系统调用的参数的总大小。

我已经用最大参数大小测试了这个程序,期望只有在超过限制时才会发生“参数列表太长”错误ARG_MAX。在我看来,命令行的最大总大小应该尽可能接近ARG_MAX限制,即不能在不超过此限制的情况下添加额外的参数(文件名)。

但我看到了另一种行为:“未使用”字节的数量以不可预测的方式波动,而环境和程序名称保持不变,只有参数数量发生变化。

问题:

  • 计数程序不正确并且缺少某些值?为什么“参数列表太长”发生得比它应该的早?
  • 这是正常行为,未使用的字节是内存填充/对齐/什么类型的?那么在内核源代码中哪里提到了这种行为?我已经阅读了linux/fs/exec.c并且没有看到可以回答我的问题的内容。

程序

计数算法如下:

尺寸argv+ 尺寸envp+ 尺寸argc

  1. argv是一个指针阵列,以字符串(指针char),因此循环通过此阵列,并加入到一个结果字符串的长度,牢记每个由NULL字节结束。然后将它们的指针添加到结果 - 指针的大小为 8 字节。因此:the number of pointers * 8+lengths of strings (each with a NULL byte)

  2. envp- 字符串长度与 NULL 字节和指针几乎相同。但是最后一个指针通过指向 NULL 字节来表示数组的末尾,因此将其添加到 result 中8 bytes + 1 bytes

  3. argc是简单的int

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int …
Run Code Online (Sandbox Code Playgroud)

c linux bash linux-kernel execve

3
推荐指数
1
解决办法
424
查看次数

标签 统计

bash ×1

c ×1

execve ×1

linux ×1

linux-kernel ×1

metaclass ×1

python-3.x ×1