2012-05-13 12 views
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オブジェクトの属性です。jythonはスーパークラスへのアクセスに失敗しました

また、JTreeの他の多くのメソッドは「スーパー」アプローチを使用してうまく動作します。

は私も行く試みた:

super(InsertRemoveJTree, self).model = treeModel 

...しかし、それは何のattrの "モデル"

その後

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

答えて

1

最初の呼び出しは、 InsertRemoveJTreeで定義されたsetModel "、すなわち再帰呼び出し。 super(JTree, self).setModel(treeModel)にJTreeで定義されているものを呼びたいとします。 ここにはPython doc for superがあります。

+0

答えに感謝します...しかし、そうではありません。通常、super(XXX、self).yyyは「メソッドyyyを呼び出すためにクラス(スーパークラスXXX)のインスタンスを使用する」を意味します。さもなければ、あなたは "スーパー"構造を全く必要としません。ここでは簡単にJTree.setModel(self、treeModel)に行くことができます。しかしsuperは、あなたがスーパークラスの名前を綴る必要がないようにするためのものです –

関連する問題