From: Humbel O. <Otm...@bi...> - 2001-09-04 16:01:00
|
[ John Goerzen ] >=20 > Another question (sorry about all of these!) >=20 > I'm porting more Java code to Jython. I've got a case like: >=20 > public static String myfunc(String id) >=20 > I'm unsure how to do a static method in Jython. Do I declare it in my > .py oustide the class: area with a @sig that has static in it? Just inside the class, but **without** the self parameter. Given file Foo.py: class Foo: # constructor def __init__( self ): pass =20 # an instance method def fooMethod( self, argument ): print "called fooMethod(%s)" % argument =20 # a 'static' method def myfunc( id ): print "called myfunc(%s)" % id Then you can call myfunc 'statically': jython -i Foo.py >>> Foo.myfunc( "hello" ) called myfunc(hello) >>> foo =3D Foo() >>> foo.fooMethod( "hi" ) called fooMethod(hi) >>>=20 Hope this helps, Oti. |
From: Humbel O. <Otm...@bi...> - 2001-09-05 07:22:57
|
[ Kevin Butler ] > Jython 2.1a1 on java1.3.0 (JIT: null) > Type "copyright", "credits" or "license" for more information. > >>> class X: > ... def go( id ): > ... print "called:", id > ...=20 > >>> X.go( "asdf" ) > Traceback (innermost last): > File "<console>", line 1, in ? > TypeError: unbound method go() must be called with instance=20 > as first argument > >>> >=20 > The 'self' parameter is not a keyword - it is a convention. =20 > Methods on class X require an X instance: >=20 > >>> X.go( X() ) > called: <__main__.X instance at 5991085> > >>>=20 >=20 > What you can do is cheat in one of two ways: >=20 > class XGo: > """Callable object to act as a static method""" > def __call__( self, id ): > print "called XGo(%s)" % id >=20 > class XStatics: > def go( self, id ): > """Use the bound method as a static method""" > print "called XStatics.go(%s)" % id > # ... and other "static" methods >=20 >=20 > class X: > go =3D XGo() > __xstatics =3D XStatics() > go2=3D__xstatics.go > # ... and other static methods >=20 > X.go( "asdf" ) > X.go2( "zxcv") >=20 > Then executing that from emacs: >=20 > Jython 2.1a1 on java1.3.0 (JIT: null) > Type "copyright", "credits" or "license" for more information. > ## working on region in file d:/TEMP/python-289AX1... > >>> called XGo(asdf) > called XStatics.go(zxcv) > >>>=20 Please **apologize** for confusing things. I currently use both Jython and JPython in two (or more) buffers in emacs, and did not test my example with Jython 2.x, because I simply could not imagine that THIS behaviour could have changed - mea culpa ! Thank you very much for pointing out (and solving !) another upgrade issue. I am already thinking about the regex expression to find def()'s without self as first argument :-) best wishes, Oti. |
From: John G. <jgo...@co...> - 2001-09-04 16:17:22
|
"Humbel Otmar" <Otm...@bi...> writes: > Just inside the class, but **without** the self parameter. Given file > Foo.py: Hmm, that's fascinating. I'm a bit new to Python as well, so let me follow up with some additional questions. I take it that the static method would have an @sig denoting static? Also, hypothetically, if there were multiple classesin the same file declaring "static" methods, how does python resolve the ambiguity? -- John Goerzen <jgo...@co...> GPG: 0x8A1D9A1F www.complete.org |
From: Kevin B. <kb...@ca...> - 2001-09-04 17:44:17
|
Humbel Otmar wrote: > > [ John Goerzen ] > > > > Another question (sorry about all of these!) > > > > I'm porting more Java code to Jython. I've got a case like: > > > > public static String myfunc(String id) > > > > I'm unsure how to do a static method in Jython. Do I declare it in my > > .py oustide the class: area with a @sig that has static in it? > > Just inside the class, but **without** the self parameter. Given file > Foo.py: No - this does _not_ work in any version of Python/Jython I've used: Jython 2.1a1 on java1.3.0 (JIT: null) Type "copyright", "credits" or "license" for more information. >>> class X: ... def go( id ): ... print "called:", id ... >>> X.go( "asdf" ) Traceback (innermost last): File "<console>", line 1, in ? TypeError: unbound method go() must be called with instance as first argument >>> The 'self' parameter is not a keyword - it is a convention. Methods on class X require an X instance: >>> X.go( X() ) called: <__main__.X instance at 5991085> >>> What you can do is cheat in one of two ways: class XGo: """Callable object to act as a static method""" def __call__( self, id ): print "called XGo(%s)" % id class XStatics: def go( self, id ): """Use the bound method as a static method""" print "called XStatics.go(%s)" % id # ... and other "static" methods class X: go = XGo() __xstatics = XStatics() go2=__xstatics.go # ... and other static methods X.go( "asdf" ) X.go2( "zxcv") Then executing that from emacs: Jython 2.1a1 on java1.3.0 (JIT: null) Type "copyright", "credits" or "license" for more information. ## working on region in file d:/TEMP/python-289AX1... >>> called XGo(asdf) called XStatics.go(zxcv) >>> kb |
From: John G. <jgo...@co...> - 2001-09-05 14:01:13
|
Kevin Butler <kb...@ca...> writes: > What you can do is cheat in one of two ways: OK, now the question is, where do I put the @sig line for Java to be able to call it, and how should it look? > class XGo: > """Callable object to act as a static method""" > def __call__( self, id ): > print "called XGo(%s)" % id > > class XStatics: > def go( self, id ): > """Use the bound method as a static method""" > print "called XStatics.go(%s)" % id > # ... and other "static" methods > > > class X: > go = XGo() > __xstatics = XStatics() > go2=__xstatics.go > # ... and other static methods > > X.go( "asdf" ) > X.go2( "zxcv") > > Then executing that from emacs: > > Jython 2.1a1 on java1.3.0 (JIT: null) > Type "copyright", "credits" or "license" for more information. > ## working on region in file d:/TEMP/python-289AX1... >>>> called XGo(asdf) > called XStatics.go(zxcv) >>>> > > kb > > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users -- John Goerzen <jgo...@co...> GPG: 0x8A1D9A1F www.complete.org |
From: Kevin B. <kb...@ca...> - 2001-09-05 14:44:07
|
John Goerzen wrote: > > Kevin Butler <kb...@ca...> writes: > > > What you can do is cheat in one of two ways: > > OK, now the question is, where do I put the @sig line for Java to be > able to call it, and how should it look? I'm pretty sure the answer is "you don't". I don't believe either cheat is supported by jythonc. kb |
From: John G. <jgo...@co...> - 2001-09-05 14:55:03
|
Kevin Butler <kb...@ca...> writes: >> OK, now the question is, where do I put the @sig line for Java to be >> able to call it, and how should it look? > > I'm pretty sure the answer is "you don't". I don't believe either cheat is supported by jythonc. Hmm, so there is absolutely no way to create, with jythonc, what would appear to java as a static function? I'd consider that to be a serious shortcoming... -- John -- John Goerzen <jgo...@co...> GPG: 0x8A1D9A1F www.complete.org |
From: Bill K. <bi...@ct...> - 2001-09-05 16:28:14
|
Hi, I'm writing Swing code and need to provide my own paintComponent() method, which is required to invoke super.paintComponent() in most cases (see http://java.sun.com/docs/books/tutorial/uiswing/converting/generaltips.html "Converting Painting Code") - but paintComponent() is a protected method of JComponent, and I'm unable to invoke it from my jython paintComponent method. I see in the jython docs on subclassing: Calling Methods in Your Superclass In Python, if I want to call the foo method in my superclass, I use the form: SuperClass.foo(self) This works with the majority of methods, but protected methods cannot be called from subclasses in this way. Instead you have to use the "self.super_foo()" call style. Could someone post an example of this call style? I've tried a couple things: self.super_paintComponent() and self.JPanel_paintComponent() but no luck with either. (JPanel being my direct superclass.) Thanks for your help, Bill |
From: <bc...@wo...> - 2001-09-05 19:20:07
|
[Bill Kelly] >I'm writing Swing code and need to provide my own paintComponent() >method, which is required to invoke super.paintComponent() in most >cases (see >http://java.sun.com/docs/books/tutorial/uiswing/converting/generaltips.html >"Converting Painting Code") - but paintComponent() is a protected >method of JComponent, and I'm unable to invoke it from my jython >paintComponent method. I see in the jython docs on subclassing: > >Calling Methods in Your Superclass > > In Python, if I want to call the foo method in my superclass, > I use the form: SuperClass.foo(self) > > This works with the majority of methods, but protected methods > cannot be called from subclasses in this way. Instead you have > to use the "self.super_foo()" call style. The docs are wrong. It should read self.super__foo() (with two underscores). >Could someone post an example of this call style? I've tried >a couple things: self.super_paintComponent() and >self.JPanel_paintComponent() but no luck with either. (JPanel >being my direct superclass.) from javax import swing class MyComponent(swing.JLabel): def __init__(self): self.setText("Hello from jython") def paintComponent(self, g): print "paintComponent" self.super__paintComponent(g) import pawt pawt.test(MyComponent()) regards, finn |
From: <bc...@wo...> - 2001-09-05 19:09:38
|
[John Goerzen] > OK, now the question is, where do I put the @sig line for Java to be > able to call [a static method], and how should it look? [Kevin Butler] > I'm pretty sure the answer is "you don't". I don't believe either cheat > is supported by jythonc. [John Goerzen] >Hmm, so there is absolutely no way to create, with jythonc, what would >appear to java as a static function? I'd consider that to be a >serious shortcoming... I suppose it depends on the viewpoint. I have never seen jythonc as a java code generator. To me, it is a jython compiler and its main purpose is to analyze and freeze a collection of jython code so that there is no need for dynamic creation of bytecode. regards, finn |
From: John G. <jgo...@co...> - 2001-09-05 19:35:14
|
bc...@wo... (Finn Bock) writes: > I suppose it depends on the viewpoint. I have never seen jythonc as a > java code generator. To me, it is a jython compiler and its main purpose > is to analyze and freeze a collection of jython code so that there is no > need for dynamic creation of bytecode. I don't see it as a Java code generator, but it *is* quite useful to be able to call Python methods from Java and to make Python methods appear to be Java methods. (Why else would there be @sig support?) -- John Goerzen <jgo...@co...> GPG: 0x8A1D9A1F www.complete.org |
From: <bc...@wo...> - 2001-09-05 19:46:02
|
>bc...@wo... (Finn Bock) writes: > >> I suppose it depends on the viewpoint. I have never seen jythonc as a >> java code generator. To me, it is a jython compiler and its main purpose >> is to analyze and freeze a collection of jython code so that there is no >> need for dynamic creation of bytecode. [John Goerzen] >I don't see it as a Java code generator, but it *is* quite useful to >be able to call Python methods from Java and to make Python methods >appear to be Java methods. (Why else would there be @sig support?) I blame Jim Hugunin for that weird feature <wink>. Ofcourse I will not remove the feature, but I don't think that I will expand on it either. Patches are always welcome, but be warning that jythonc is a unstable minefield ready to explode even at the slightest modification. regards, finn |