【问题标题】:metaclass error when inheriting from psychopy.visual.DotStim从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 或其基类在哪里使用任何元类,所以我对此感到非常困惑。

有什么建议吗?

【问题讨论】:

    标签: inheritance psychopy


    【解决方案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”。谢谢!
    猜你喜欢
    • 2021-06-05
    • 2016-05-15
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多