Add methods to string objects.

Rocco Moretti roccomoretti at hotpop.com
Thu Jun 30 09:31:53 EDT 2005


Roy Smith wrote:
> In article <1120134661.407265.251710 at z14g2000cwz.googlegroups.com>,
>  "simon.dahlbacka at gmail.com" <simon.dahlbacka at gmail.com> wrote:
> 
> 
>>You can even get closer, but it is NOT recommended
>>
>>class foostr(str):
>>     def plural (self):
>>        if self.value[-1] in "sz":
>>            return self.value + "es"
>>        else:
>>            return self.value + "s"
>>
>>
>>#ugly hack
>>setattr(__builtins__, "str", foostr)
>>
>>print str("apple").plural()
>>
>># this however does not work
>># print "apple".plural()
> 
> 
> It's fascinating that the setattr() works (and I agree with you that it's a 
> bad idea), but given that it does work, why doesn't it work with a string 
> literal?

Because the string literal is the *actual* C-level builtin string type, 
not whatever type happens to be in __builtins__.str at the time. ("At 
the time" is also a tricky proposition - string literals are made into 
obects at compile time, before __builtins__ is twiddled with.)

BTW, on setattr():

'''
setattr( object, name, value)

This is the counterpart of getattr(). The arguments are an object, a 
string and an arbitrary value. The string may name an existing attribute 
or a new attribute. The function assigns the value to the attribute, 
provided the object allows it. For example, setattr(x, 'foobar', 123) is 
equivalent to x.foobar = 123.
'''

i.e. '''setattr(__builtins__, "str", foostr)''' is the same as 
'''__builtins__.str = foostr''', but I would agree that the setattr 
gives more of a "black magic" warning.



More information about the Python-list mailing list