From: Charlie G. <cha...@gm...> - 2007-07-17 05:44:21
|
Hi David, It looks like you're hitting http://jython.org/bugs/649582. Essentially, if you attempt to create a subclass in Python of a Java class with a protected constructor, and that Java class is a subclass of a class with a protected constructor, you'll see this error. Part of the plan for the Jython release one removed is to fix some corner cases in python-java integration like this one, but this won't be fixed for the upcoming 2.2 release. A simple workaround is to create a Java class extending ControlContribution with a public constructor and extend that new class from Python. Hope this helps, Charlie On 7/13/07, David Huebel <dav...@gm...> wrote: > Hi all, > > I have run into difficulty calling a superclass constructor again. > This time I upgraded to jython 2.2rc2 and created a minimal failure > case. This should either make it obvious what I'm doing wrong or make > it easy for anyone who has Eclipse to reproduce the problem. > > To recap: When my constructor attempts to call the superclass > constructor, I get an AttributeError saying that the superclass has no > attribute '__init__'. > > Here is a session where I declare a minimal subclass of the abstract > class org.eclipse.jface.action.ControlContribution, trigger the error, > and verify that ControlContribution has a protected constructor that > takes a single String argument. ECLIPSE_CP is a classpath containing > all the jars in my eclipse/plugins/ directory. (More comments below > the session.) > > ------------------------- > > dhuebel@shal:~$ rlwrap /opt/jython2.2rc2/jython > -Dpython.path=$PYTHONPATH:$ECLIPSE_CP > Jython 2.2rc2 on java1.6.0 > Type "copyright", "credits" or "license" for more information. > >>> > from org.eclipse.jface.action import ControlContribution > > class ComboContributionItem2(ControlContribution): > def __init__(self, labelText): > ControlContribution.__init__(self, labelText) > > def createControl(self, *args): > return None > > >>> >>> ... ... ... >>> >>> ... > ... > >>> con = ComboContributionItem2('hi') > Traceback (innermost last): > File "<console>", line 1, in ? > File "<console>", line 3, in __init__ > AttributeError: class 'org.eclipse.jface.action.ControlContribution' > has no attribute '__init__' > >>> len(ControlContribution.getDeclaredConstructors()) > 1 > >>> ControlContribution.getDeclaredConstructors()[0] > protected org.eclipse.jface.action.ControlContribution(java.lang.String) > >>> > > ----------------------- > > Possibly relevant: I can directly invoke the protected constructor of > the abstract class java.lang.Number, but I cannot directly invoke the > constructor of ControlContribution: > > >>> Number.__init__(None) > Traceback (innermost last): > File "<console>", line 1, in ? > TypeError: invalid self argument to constructor > >>> ControlContribution.__init__(None, 'hi') > Traceback (innermost last): > File "<console>", line 1, in ? > AttributeError: class 'org.eclipse.jface.action.ControlContribution' > has no attribute '__init__' > > Please help me out if there's an obvious error in my code. Otherwise, > are there any other debugging steps I should take? > > Thanks, > David > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users > |