Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

super function doesn't work inside a maya python module

Tags:

python

class

maya

Somehow, this works fine in the Maya/Python script editor, but fails when it's inside of my module code. Anyone have any ideas?

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()

This gives me a TypeError: super(type, obj): obj must be an instance or subtype of type.

like image 919
jedmao Avatar asked Nov 29 '22 04:11

jedmao


2 Answers

It has to do with reloading modules. Reloading a module often changes the internal object in memory which makes the isinstance test of super return False.

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

like image 57
Chad Vernon Avatar answered Dec 16 '22 18:12

Chad Vernon


I had this exact same problem. It's definitely not practical to restart maya each time you make a change. I found an answer here that solved this problem for me.

You should read the linked answer to understand why its only suitable for debugging. But briefly, put this code in userSetup.py, then each time you edit your code run 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__)
like image 45
Julian Mann Avatar answered Dec 16 '22 19:12

Julian Mann