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

モジュールのリロードに関係しています。モジュールをリロードすると、メモリ内の内部オブジェクトが変更されることが多く、スーパーの 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 に答える