From: Oti <oh...@ya...> - 2002-11-06 05:37:37
|
[ Finn Bock ] > Well, I don't like this feature that much. It just seems too magicly > for > my taste (and yes, I also find the calls to __getitem__ etc. too > magicly). Since this is java, I think the methods should be more > staticly bound. Or at the very least, that a java class should > announce > that it want to participate in the jython operator game. F.ex by > extending an interface. Hello Finn, Samuele and Ype, thank you very much for the time you put into the discussion of this idea! Maybe I have to go one step back to explain, from a higher level point of view, what I want to do and why: Enable java classes to implement 'Special Methods' (Jython Essentials chapter 5, pages 98-103). from page 99: "Using special methods well enables your classes to have the look and feel of Python's built-in types, and allows you the convenience of, for example, using + instead of add() for your list-like types." I want to use them well for *java* classes. Now why (Ype wrote 'it can be done in python')? I try to show with an example what the benefits of doing it in java would be. Let Entity be a generic java class representing any database table. Instances of Entity (like Person, Address, Order etc.) have generic attribute access methods and database query methods. A very simplified implementation of Entity could look like this: public class Entity { public Entity(String tableName) {...} public Datatype getAttribute(String name) {...} public void setAttribute(String name, Object value) {...} /** returns a 'result set' */ public Entity[] query(String selectionName) {...} } public class Datatype { public Datatype( Object value ) {...} public int compareTo( Object other ) {...} public boolean equals( Object other ) {...} public Datatype add( Datatype other ) } Without special method support, scripting in Jython looks like this: user1 = Entity("Person") user1.setAttribute("name", "first user") user1.setAttribute("age", 25) user2 = Entity("Person") user2.setAttribute("name", "second user") user2.setAttribute("age", 35) # comparisons and arithmetic operations get really awkward if user1.getAttribute("age").compareTo(user2.getAttribute("age") == 0: print "%s has the same age like %s" % (user1.getAttribute("name"), user2.getAttribute("name")) user1.setAttribute("age", user1.getAttribute("age").add(1) # queries look very unnatural for p in user1.query("ByANonUniqueCriterion"): # do something with p user1.setAttribute("name", "new name") if len(user1.query("PrimaryKey")) == 1: print "%s is unique" % user1.getAttribute("name") With special method support, and Entity implementing __setattr__/__getattr__, and Datatype implementing __eq__, __iadd__ etc., the same example gets: user1 = Entity("Person") user1.name = "first user" user1.age = 25 user2 = Entity("Person)" user2.name = "second user" user2.age = 35 # comparisons and arithmetic operations get really elegant if user1.age == user2.age: print "%s has the same age like %s" % (user1.name, user2.name) user1.age += 1 # queries are natural method calls for p in user1.queryByANonUniqueCriterion(): # do something with p user1.name = "new name" if len(user1.queryPrimaryKey()) == 1: print "%s is unique" % user1.name To summarize, let's look at a list of benefits: - start scripting right away - no need for python wrapper classes - python and java classes have the same look and feel - end user friendly Can we, regardless of any actual or future implementation details and in the name of a closer java integration, all agree that 'enabling Special Methods for java classes' is a desirable feature for Jython ? If yes, let's discuss how we can get there. Best wishes, Oti. __________________________________________________ Do you Yahoo!? HotJobs - Search new jobs daily now http://hotjobs.yahoo.com/ |