从psychopy.visual.DotStim 继承时出现元类错误

Posted

技术标签:

【中文标题】从psychopy.visual.DotStim 继承时出现元类错误【英文标题】:metaclass error when inheriting from psychopy.visual.DotStim 【发布时间】:2016-03-12 23:49:12 【问题描述】:

我正在尝试像这样从 visual.DotStim 继承一个类

class JitterDots(visual.DotStim):
...

我总是遇到臭名昭著的元类错误:

TypeError: Error when calling the metaclass bases metaclass conflict:派生类的元类必须是其所有基类的元类的(非严格)子类

我知道您可以通过合并所有基类的元类来解决此问题,但我看不到 DotStim 或其基类在哪里使用任何元类,所以我对此感到非常困惑。

有什么建议吗?

【问题讨论】:

【参考方案1】:

这似乎对我有用:

from psychopy.visual import dot

class JitterDots(dot.DotStim):
    pass

与您的直接问题无关,但仍然是一个可能的陷阱: 我还注意到DotStim 的一些基类/父类直接继承自object,但从未通过super() 初始化它们的父类——尽管super()DotStim.__init__() 中被调用。但是,“这样做会导致其他类的 __init__ 方法不被调用”,根据https://fuhm.net/super-harmful/

【讨论】:

这是视觉模块相对较新的延迟导入的结果(在首次使用时导入,而不是在导入视觉模块时导入)。这通常可以在大多数情况下实现更快的性能。 所以在某些基础中缺少对super() 的调用不应被视为错误,而是被故意遗漏了?还是您指的是我提出的示例代码及其与 Gerrit 问题的关系? 我认为应该修复丢失的对 super() 的调用,这不是故意的。但我认为 Gerrit 的问题是由于新使用了惰性导入。导入视觉对象时,DotStim 不会自动导入其名称空间。只有在实际使用时才在那里导入。 感谢您的澄清。 好的,所以我需要明确地“导入psychopy.visual.dot”。谢谢!

以上是关于从psychopy.visual.DotStim 继承时出现元类错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从其他面板从 JTextField 获取输入

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?