4

不知何故,这在 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 must be an instance or subtype of type。

4

4 回答 4

21

它与重新加载模块有关。重新加载一个模块经常会改变内存中的内部对象,这使得 super 的 isinstance 测试返回 False。

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

于 2011-05-03T16:30:13.290 回答
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__)
于 2012-10-27T02:17:29.690 回答
0

如果你使用你总是这样称呼它的 super(Class, self).__init__,这是一个很好的经验法则。这适用于从对象继承的类。

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

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

于 2010-05-11T17:37:00.933 回答
0

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

于 2010-05-15T11:59:50.703 回答