From: Andrew Dalke Date: 2001-08-08T13:35:27+09:00 Subject: [ruby-talk:19343] Re: Perl/Python/Ruby common backend (Parrot, can Ruby play too?) Erno Kuusela wrote: >you can do this: >>>> def new_eat(self): >... print 'yech' >... >>>> Spam.eat = new_eat >>>> >>>> spam.eat() >yech I do want to emphasize that this isn't a need of mine. I brought this up as part of a Ruby/Python comparison, and I was stating that I don't think adding new methods to an existing class is a good practice. Python's "magic incantation" as you call it is more the way I prefer things, unlike in Ruby where this sort of technique seems to be encouraged. I mentioned the only case I've come across where someone wanted to add a method dynamically to existing classes and all existing instances, which was a development system meant for non-programmers where there should be an easy way to change the system without having to keep track of all the instance dependencies. The researcher on this system (as I recall) decided against Python because it requires a non-standard/magic way to do this. I don't have the use cases to help determine what would be a better system. There are dozens of possible solutions. BTW, your trick of attaching functions to the class has its own brand of magic: >>> class Spam: .... pass .... >>> import math >>> Spam.cos = math.cos >>> def my_cos(x): .... return math.cos(x) .... >>> Spam.my_cos = my_cos >>> spam = Spam() >>> spam.cos(0) 1.0 >>> spam.my_cos(0) Traceback (most recent call last): File "", line 1, in ? TypeError: too many arguments to my_cos(); expected 1, got 2 >>> This is because builtin functions aren't bound into a method reference, while Python functions are - something I regard as a wart in Python, as the result is implementation dependent. http://groups.google.com/groups?hl=en&safe=off&th=f16901b55fd6962b,6&seekm=8 j83ml%242s7%241%40slb3.atl.mindspring.net#p But at least it's documented :) Andrew dalke@dalkescientific.com