从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 继承时出现元类错误的主要内容,如果未能解决你的问题,请参考以下文章