2010-05-11 2 views
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는 형식의 인스턴스 또는 하위 유형이어야합니다.

+0

이 ipython에 붙여 내가 오류를 못해서에서 다른 코드 확인이없는 당신의 프로그램? – catchmeifyoutry

+0

전체 역 추적이 도움이됩니다. 이 코드는 CPython 2.6.5에서도 작동합니다. – msw

+0

예, 문제는 그것이 이해가 안되는 Maya 모듈 내에서 작동하지 않는다는 것입니다. – jedmao

답변

0

모듈 상단에있는 가져 오기와 관련이 있습니다. 나는 그것이 어느 것이었던 지 잊는다. 나는 그것이 무엇인지를 발견 한 순간에 이것을 게시 했어야했다.

0

언제나 super (Class, self) .__ init__를 사용하는 것은 경험의 좋은 규칙입니다. 이것은 객체에서 상속받은 클래스에 적용됩니다.

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

오류가 수정되는지 확인하십시오. 내가 마야를 사용하지는 않지만 추측할만한 가치가 있다고 생각합니다.

21

모듈을 다시로드하는 것과 관련이 있습니다. 모듈을 다시로드하면 메모리의 내부 객체가 변경되어 수퍼 테스트 False의 isinstance 테스트가 수행됩니다.

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

+2

방금 ​​방금 날을 저장했습니다. 내 코드는 높은 가동 시간이 필요한 데몬 (deamon)에서 사용되었으며, 모듈의 리로드가 사용되었습니다. 귀하의 답변에 감사하기 전에 알지 못했던 것입니다. 분명히 우리는이 가난한 해킹보다 더 안정적인 것이 필요할 것입니다. – vincent

+2

이것은 꽤 자주 ipython의 자동로드 기능을 사용하여 발생합니다 –

4

나는 이와 똑같은 문제가있었습니다. 변경을 할 때마다 마야를 재시작하는 것은 확실히 실용적이지 않습니다. 나는이 문제를 해결 한 answer here을 찾았다.

왜 그 디버깅에만 적합한 지 이해하려면 링크 된 대답을 읽어야합니다. 그러나 잠시, userSetup.py에서이 코드를 삽입, 각 시간 당신이 (my_package) 코드 실행 reload_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__) 
+0

어쨌든 ipython의 자동로드를 연결하는 것이 있습니까? 그렇지 않으면'super '가있는 패키지에서 라인이 변경 될 때마다 커널을 재시작해야한다. – dashesy

+0

ipython의'% autoreload 2'가 작동하지 않을 때조차도 작동한다. TypeError : super (type, obj) : obj는 인스턴스 여야한다. 또는 하위 유형 ' ' – dashesy

관련 문제