Agregar método personalizado a objeto de cadena

Posible duplicado:
¿Puedo agregar métodos / atributos personalizados a los tipos de Python incorporados?

En Ruby, puedes anular cualquier clase de objeto integrada con un método personalizado, como este:

class String def sayHello return self+" is saying hello!" end end puts 'JOHN'.downcase.sayHello # >>> 'john is saying hello!' 

¿Cómo puedo hacer eso en python? ¿Hay una forma normal o simplemente hacks?

No puedes porque los tipos incorporados están codificados en C. Lo que puedes hacer es subclasificar el tipo:

 class string(str): def sayHello(self): print(self, "is saying 'hello'") 

Prueba:

 >>> x = string("test") >>> x 'test' >>> x.sayHello() test is saying 'hello' 

También puede sobrescribir el tipo str con la class str(str): pero eso no significa que pueda usar el "test" literal, porque está vinculado a la str incorporada.

 >>> x = "hello" >>> x.sayHello() Traceback (most recent call last): File "", line 1, in  x.sayHello() AttributeError: 'str' object has no attribute 'sayHello' >>> x = str("hello") >>> x.sayHello() hello is saying 'hello' 

El equivalente normal de Python a esto es escribir una función que tome una cadena como primer argumento:

 def sayhello(name): return "{} is saying hello".format(name) >>> sayhello('JOHN'.lower()) 'john is saying hello' 

Sencillo limpio y fácil. No todo tiene que ser un método llamado.