1
class  InsertRemoveJTree( JTree ):
    def setModel( self, treeModel ):
    # for reasons I don't understand, the first call below results in infinite recursion... 
    # in other words the "super" approach returns this object, not its underlying base-class 
    # object.  The second approach works as expected
        # super( InsertRemoveJTree, self ).setModel( treeModel )
        JTree.setModel( self, treeModel )  

誰がこれが何であるか分かりましたか?「setModel」は、dir() によってリストされる InsertRemoveJTree オブジェクトの属性です。

また、「スーパー」アプローチを使用すると、JTree の他の多くのメソッドが正常に機能します。

私も行ってみました:

super(InsertRemoveJTree, self ).model = treeModel

...しかし、属性「モデル」がないと主張しました

後で

これは、既存の Java クラスでメソッドを呼び出すという事実による制限であり、「JTree の他の多くのメソッドも「スーパー」アプローチを使用して正常に動作する」という結論に達しました。間違っている。super_XXX (例: DefaultTreeModel: super _fireTreeNodesInserted)によって呼び出される保護されたメソッドがいくつかあり、dir( instance ) を使用してインスタンスの属性を調べ始めるまで、初心者の Jython ユーザーにかなりの問題を引き起こします。しかし、原則として、これは一般的な制限のようです。つまり、"super( PresentClass, self )..." を使用して、Jython でサブクラス化された Java クラスの基底クラスを呼び出すことはできません。

4

1 に答える 1

1

最初の呼び出しは、「InsertRemoveJTreeで定義されたsetModelを呼び出す」、つまり再帰呼び出しを意味します。super( JTree, self ).setModel( treeModel )JTreeで定義されているものを呼び出します。これがsuperのPythonドキュメントです

于 2012-05-14T11:35:30.270 に答える