super函数在Maya Python模块中无法使用

5 投票
4 回答
6179 浏览
提问于 2025-04-15 22:34

不知道为什么,这在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()

这个代码让我遇到了一个类型错误:super(type, obj): obj必须是type的一个实例或者子类。

4 个回答

4

我也遇到过完全一样的问题。每次修改后都重启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__)
22

这跟重新加载模块有关。重新加载一个模块时,内存中的对象通常会发生变化,这就导致使用isinstance测试super时返回False。

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

0

原来这和我在模块顶部的导入有关。不过我忘了具体是哪一个了。我应该在发现问题的时候就把这个发出来。

撰写回答