不知何故,这在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必须是类型的实例或子类型。
答案 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)
原来这与我在模块顶部的导入有关。不过,我忘了它是哪一个。我应该在发现它的那一刻发布这个。