супер функция не работает внутри модуля Python Maya - PullRequest
4 голосов
/ 11 мая 2010

Каким-то образом это прекрасно работает в редакторе сценариев Maya / Python, но не работает, когда он находится внутри моего кода модуля. У кого-нибудь есть идеи?

class ControlShape(object):
    def __init__(self, *args, **kwargs):
        print 'Inside ControlShape...'

class Cross(ControlShape):
    def __init__(self, *args, **kwargs):
        print 'Entering Cross...'
        super(Cross, self).__init__(*args, **kwargs)
        print 'Leaving Cross...'

x = Cross()

Это дает мне TypeError: super (type, obj): obj должен быть экземпляром или подтипом типа.

Ответы [ 4 ]

21 голосов
/ 03 мая 2011

Это связано с перезагрузкой модулей. Перезагрузка модуля часто изменяет внутренний объект в памяти, что делает проверку экземпляра супер возврата False.

http://thingspython.wordpress.com/2010/09/27/another-super-wrinkle-raising-typeerror/

4 голосов
/ 27 октября 2012

У меня была точно такая же проблема. Определенно не практично перезапускать Maya каждый раз, когда вы вносите изменения. Я нашел ответ здесь , который решил эту проблему для меня.

Вы должны прочитать связанный ответ, чтобы понять, почему он подходит только для отладки. Но вкратце, поместите этот код в userSetup.py, а затем каждый раз, когда вы редактируете свой код, запускайте reload_package (my_package)

import sys, types
def reload_package(root_module):
    package_name = root_module.__name__

    # get a reference to each loaded module
    loaded_package_modules = dict([
        (key, value) for key, value in sys.modules.items() 
        if key.startswith(package_name) and isinstance(value, types.ModuleType)])

    # delete references to these loaded modules from sys.modules
    for key in loaded_package_modules:
        del sys.modules[key]

    # load each of the modules again; 
    # make old modules share state with new modules
    for key in loaded_package_modules:
        print 'loading %s' % key
        newmodule = __import__(key)
        oldmodule = loaded_package_modules[key]
        oldmodule.__dict__.clear()
        oldmodule.__dict__.update(newmodule.__dict__)
0 голосов
/ 15 мая 2010

Оказывается, это как-то связано с моим импортом в верхней части модуля. Я забыл, какой это был, хотя. Я должен был опубликовать это, как только узнал, что это было.

0 голосов
/ 11 мая 2010

Хорошее эмпирическое правило, если вы используете super (Class, self) .__ init__, который вы ВСЕГДА называете так. Это относится к вашим классам, которые наследуются от объекта.

class ControlShape(object):
   def __init__(self, *args, **kwargs):
      super(ControlShape, self).__init__()
      print 'Inside ControlShape...'

Посмотрите, исправит ли это вашу ошибку. Просто предположение, поскольку я не использую майю, но стоит попробовать.

...