super函数在maya python模块中不起作用

时间:2010-05-11 04:08:03

标签: python class maya

不知何故,这在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 个答案:

答案 0 :(得分:21)

它与重新加载模块有关。重新加载模块通常会更改内存中的内部对象,这使得超级返回的isinstance测试返回False。

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

答案 1 :(得分:4)

我有同样的问题。每次进行更改时重启maya绝对不切实际。我发现answer here为我解决了这个问题。

你应该阅读链接的答案,了解为什么它只适合调试。但是简单地说,将此代码放在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__)

答案 2 :(得分:0)

如果您使用超级(Class,self).__ init__,这总是很好的经验法则,您总是这样称呼它。这适用于从object继承的类。

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

看看是否能解决您的错误。只是一个猜测因为我不使用玛雅,但值得一试。

答案 3 :(得分:0)

原来这与我在模块顶部的导入有关。不过,我忘了它是哪一个。我应该在发现它的那一刻发布这个。