2011-01-15 4 views
5

Possible en double:
Can I add custom methods/attributes to built-in Python types?Ajouter méthode personnalisée pour objet chaîne

Dans Ruby vous pouvez remplacer une classe intégrée d'objets avec méthode personnalisée, comme ceci:

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

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

Comment puis-je faire ça en python? Y a-t-il une manière normale ou juste des hacks?

+1

Cela a juste été répondu à http://stackoverflow.com/questions/4698493/can-i-add-custom-methods-attributes-to-built-in-python-types/4698550#4698550. Suggérer la fermeture. – TryPyPy

+0

Monkeypatching est possible mais a des limites, comme indiqué dans cette question (et même plus). Je recommande simplement de définir une fonction "gratuite" qui le fait. – delnan

Répondre

11

Vous ne pouvez pas parce que les builtin-types sont codés en C. Ce que vous pouvez faire est de sous-classe du type:

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

Test:

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

Vous pouvez également remplacer le STR- tapez avec class str(str):, mais cela ne signifie pas que vous pouvez utiliser le littéral "test", car il est lié à l'str intégré.

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

Le Python normale équivalent à cela est d'écrire une fonction qui prend une chaîne comme il est le premier argument:

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

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

propre et facile simple. Tout ne doit pas être un appel de méthode.

+0

L'inconvénient de cette approche est que vous ne pouvez pas écrire une méthode de mutateur. Par exemple, aujourd'hui je veux une méthode 'str.startswithThenRemove (p)' qui mute 'str' pour enlever le préfixe optionnel' p' et retourne alors 'True' si le préfixe a été trouvé et' False' s'il ne l'était pas: 'si option.startswithThenRemove (" - foo = "): handleFoo (option)'. Vous ne pouvez pas le faire facilement en Python (mais voyez http://stackoverflow.com/a/1551223/1424877). – Quuxplusone

+4

Même si vous pouviez ajouter une méthode personnalisée à une chaîne, vous ne seriez toujours pas capable d'écrire une méthode de mutateur: Les chaînes Python sont immuables. – Duncan

Questions connexes