2011-01-15 24 views
5

Duplicar posibles:
Can I add custom methods/attributes to built-in Python types?Añadir método personalizado a objeto de cadena

en Ruby puede anular cualquier clase incorporada objeto con método personalizado, así:

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 manera normal o simplemente piratea?

+1

Esto acaba de ser respondido en http://stackoverflow.com/questions/4698493/can-i-add-custom-methods-attributes-to-built-in-python-types/4698550#4698550. Sugerir cierre. – TryPyPy

+0

El parche de mono es posible pero tiene límites, como se señala en esa pregunta (y aún más). Recomiendo simplemente definir una función "gratuita" que hace esto. – delnan

Respuesta

11

Puede no porque la orden interna tipos están codificadas en C. Lo que se puede hacer es una subclase del tipo:

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

prueba:

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

Usted también podría sobrescribir el str- escriba con class str(str):, pero eso no significa que pueda usar el literal "test", porque está enlazando con el str incorporado.

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

La normal de Python equivalente a esto es escribir una función que toma una cadena como su primer argumento:

def sayhello(name): 
    return "{} is saying hello".format(name) 

>>> sayhello('JOHN'.lower()) 
'john is saying hello' 

simple limpio y fácil. No todo tiene que ser una llamada a un método.

+0

La desventaja de este enfoque es que no se puede escribir un método de mutador. Por ejemplo, hoy quiero un método 'str.startswithThenRemove (p)' que muta 'str' para eliminar el prefijo opcional' p' y luego devuelve 'True' si se encontró el prefijo y' False' si no lo era: 'if option.startswithThenRemove (" - foo = "): handleFoo (opción)'. No puedes hacer eso de manera fácil en Python (pero mira http://stackoverflow.com/a/1551223/1424877). – Quuxplusone

+4

Incluso si pudieras agregar un método personalizado a una cadena, aún no podrías escribir un método de mutador: las cadenas de Python son inmutables. – Duncan

Cuestiones relacionadas