2015-12-08 3 views
1

Я пытаюсь унаследовать класс от visual.DotStim как этоошибка метаклассом при наследовании от psychopy.visual.DotStim

class JitterDots(visual.DotStim): 
... 

Я всегда получаю позорную ошибку метакласса:

TypeError: Error when calling the metaclass bases metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

I понимаете, вы можете это исправить, объединив метаклассы базовых классов, но я не вижу, где DotStim или его базы используют какие-либо метаклассы, поэтому я действительно смущен этим.

Любые предложения?

ответ

1

Это, кажется, работает для меня:

from psychopy.visual import dot 

class JitterDots(dot.DotStim): 
    pass 

Unrelated своего непосредственный вопрос, но все-таки возможно ловушка: Я также заметил, что некоторые из база/родители DotStim наследует непосредственно от object, но никогда не инициализируйте их родителем через super() - хотя super() вызывается в DotStim.__init__(). Тем не менее, «это приведет к тому, что другие классы« __init__ методов не будут называться », в соответствии с https://fuhm.net/super-harmful/

+1

Это является следствием относительно нового ленивого импорта визуальных модулей (импорт при первом использовании, а не при визуальном импортировании) , Это позволяет в большинстве случаев ускорить работу в большинстве случаев. – jrgray

+0

Итак, недостающие вызовы 'super()' в некоторых базах не считаются ошибкой, но были упущены намеренно? Или вы ссылались на мой предложенный примерный код и его отношение только к проблеме Геррита? – hoechenberger

+1

Я думаю, что недостающие вызовы super() должны быть исправлены, что не было преднамеренным. Но я думаю, что проблема Геррита связана с новым использованием ленивого импорта. Когда визуал импортируется, DotStim автоматически не импортируется в его пространство имен. Его только импортируется там, когда он используется. – jrgray

Смежные вопросы