2011-01-15 6 views
5

Eventuali duplicati:
Can I add custom methods/attributes to built-in Python types?Aggiungi metodo personalizzato per oggetto stringa

In Ruby è possibile ignorare qualsiasi classe incorporata oggetto con metodo personalizzato, in questo modo:

class String 
    def sayHello 
    return self+" is saying hello!" 
    end 
end        

puts 'JOHN'.downcase.sayHello # >>> 'john is saying hello!' 

Come posso farlo in Python? C'è un modo normale o solo hack?

+1

Questo è stato appena risposto in http://stackoverflow.com/questions/4698493/can-i-add-custom-methods-attributes-to-built-in-python-types/4698550#4698550. Suggerisci chiusura – TryPyPy

+0

Monkeypatching è possibile ma ha dei limiti, come sottolineato in questa domanda (e anche di più). Raccomando solo la definizione di una funzione "libera" che faccia questo. – delnan

risposta

11

Non è possibile perché i builtin-tipi sono codificati in C. Che cosa si può fare è creare una sottoclasse del tipo:

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

prova:

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

Si potrebbe anche sovrascrivere lo Str- digitare con class str(str):, ma ciò non significa che è possibile utilizzare il valore letterale "test", poiché è collegato allo standard integrato str.

>>> 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

Il Python normale equivalente a questo è quello di scrivere una funzione che prende una stringa come è primo argomento:

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

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

semplice pulito e facile. Non tutto deve essere una chiamata al metodo.

+0

Lo svantaggio di questo approccio è che non è possibile scrivere un metodo di mutatore. Ad esempio, oggi voglio un metodo 'str.startswithThenRemove (p)' che muta 'str' per rimuovere il prefisso opzionale' p' e poi restituisce 'True' se il prefisso è stato trovato e' False' se non lo era: 'if option.startswithThenRemove (" - foo = "): handleFoo (opzione)'. Non è possibile farlo in modo semplice in Python (ma vedere http://stackoverflow.com/a/1551223/1424877). – Quuxplusone

+4

Anche se si potesse aggiungere un metodo personalizzato a una stringa, non si sarebbe ancora in grado di scrivere un metodo mutatore: le stringhe Python sono immutabili. – Duncan

Problemi correlati