Par exemple, disons que je veux ajouter une méthode helloWorld()
au type de dict de Python. Puis-je faire ceci?
JavaScript a un objet prototype qui se comporte de cette façon. C'est peut-être une mauvaise conception et je devrais sous-classer l'objet dict, mais cela ne fonctionne que sur les sous-classes et je veux qu'il fonctionne sur tous les dictionnaires futurs.
Voici comment cela se passerait en JavaScript:
String.prototype.hello = function() {
alert("Hello, " + this + "!");
}
"Jed".hello() //alerts "Hello, Jed!"
Voici un lien utile avec plus d'exemples— http://www.javascriptkit.com/javatutors/proto3.shtml
Vous ne pouvez pas ajouter directement la méthode au type d'origine. Cependant, vous pouvez sous-classer le type puis le remplacer dans l'espace de noms intégré/global, ce qui produit la plupart de l'effet souhaité. Malheureusement, les objets créés par la syntaxe littérale continueront d'être du type Vanilla et n'auront pas vos nouvelles méthodes/attributs.
Voici à quoi ça ressemble
# Built-in namespace
import __builtin__
# Extended subclass
class mystr(str):
def first_last(self):
if self:
return self[0] + self[-1]
else:
return ''
# Substitute the original str with the subclass on the built-in namespace
__builtin__.str = mystr
print str(1234).first_last()
print str(0).first_last()
print str('').first_last()
print '0'.first_last()
output = """
14
00
Traceback (most recent call last):
File "strp.py", line 16, in <module>
print '0'.first_last()
AttributeError: 'str' object has no attribute 'first_last'
"""
Je viens d'essayer le fruit interdit!
voici le code, très simple!
from forbiddenfruit import curse
def list_size(self):
return len(self)
def string_hello(self):
print("Hello, {}".format(self))
if __== "__main__":
curse(list, "size", list_size)
a = [1, 2, 3]
print(a.size())
curse(str, "hello", string_hello)
"Jesse".hello()
Oui, en sous-classant ces types. Voir nification des types et des classes en Python .
Non, cela ne signifie pas que les dicts réels auront ce type, car ce serait déroutant. La sous-classification d'un type intégré est le moyen préféré d'ajouter des fonctionnalités.
class MyString:
def __init__(self, string):
self.string = string
def bigger_string(self):
print(' '.join(self.string))
mystring = MyString("this is the string")
mystring.bigger_string()
production
t h i s i s t h e s t r i n g
Classe de données dans Python 3.7
from dataclasses import dataclass
@dataclass
class St:
text : str
def bigger(self) -> None:
self.text = list(self.text)
print(" ".join(self.text))
mys = St("Hello")
mys.bigger()
production
H e l l o