小编Cra*_*ium的帖子

可以使用MRO来覆盖mixin吗?

问题描述:我有一个类C从混入继承AB.我想要一个新类,C_具有在类中定义的所有方法/属性,C但在继承方案中BB_(相同的API)交换(一种可能的用法是容易模拟).所有课程都是新式课程.

通过搞乱继承顺序,我得到了我想要的东西,因此MRO:

A   B   B_    B_  A   B
 \ /   /       \   \ /
  C   /         \   C
   \ /           \ /
    C1            C2
C1(C,B_)       C2(B_,C)

C1.__mro__ = (C1, C , A, B, B_, object)
C2.__mro__ = (C2, B_, C, A, B , object)
Run Code Online (Sandbox Code Playgroud)

C2方法(继承之前改性混入C类)工作而不会太大的惊喜和,如果我呼叫在所定义的方法B混入时,B_被选择的定义.

目前它有效,但我觉得:"手指交叉,我希望不会出现特殊情况并破坏系统!"

问题是:它是一种解决问题的最终解决方案,还是有更好的方法?

PS:我想我可以带上我的火箭筒并创建一个元类来重新定义mro(正如官方文档中所述),但我的直觉说它不一定更漂亮.

python multiple-inheritance mixins python-3.x

7
推荐指数
1
解决办法
197
查看次数

对堆上结构体的结构体初始化语法的使用

我有一个简单的结构,我想在堆上初始化并作为函数中的指针返回。

struct entry {
    const char* const key; // We don't want the key modified in any way
    const void* data;      // But the pointer to data can change
    struct entry* next;
};
Run Code Online (Sandbox Code Playgroud)

有一个问题,我不能calloc一一初始化成员,因为它key是一个常量指针。我在某处找到了这种有效的语法:

struct entry* entry = calloc(1, sizeof(struct entry));
*entry = (struct entry) { .key = key, .data = data, .next = NULL };
Run Code Online (Sandbox Code Playgroud)

但我不知道它发生了什么:它是否创建了一个“匿名”结构,然后将其复制到*entry居住的地方?这是否安全使用,还是我应该更喜欢创建一个本地结构,然后将其复制memcpy到正确的位置?

c struct initialization heap-memory

2
推荐指数
1
解决办法
759
查看次数