105 votes

Puis-je ajouter des méthodes/attributs personnalisés aux types Python intégrés?

Par exemple—disons que je veux ajouter une méthode helloWorld() au type dict de Python. Puis-je le faire?

JavaScript a un objet prototype qui se comporte de cette manière. Peut-être que c'est une mauvaise conception et je devrais sous-classer l'objet dict, mais alors cela ne fonctionne que sur les sous-classes et je veux que cela fonctionne sur tous les futurs dictionnaires.

Voici comment cela se passerait en JavaScript:

String.prototype.hello = function() {
    alert("Bonjour, " + this + "!");
}
"Jed".hello() //alerte "Bonjour, Jed!"

Voici un lien utile avec plus d'exemples— http://www.javascriptkit.com/javatutors/proto3.shtml

2voto

Osama Adel Points 130

Pour ajouter une méthode et un attribut personnalisés à une liste :

import gc

dikt=gc.get_referents(list.__dict__)[0]

dikt['length']= property(lambda self: len(self)) # attribut length

def push(self,data):self+=[data]

dikt['push']= push  # méthode push

a=[1,2,3]
print(a.length)
a.push(4)
print(a.length)
print(a)

1voto

Rafe Kettler Points 29389

Oui, en sous-classifiant ces types. Voir unification des types et des classes en Python.

Non, cela ne signifie pas que les dictionnaires réels auront ce type, car ce serait confus. La sous-classification d'un type prédéfini est la méthode préférée pour ajouter des fonctionnalités.

1voto

Giovanni Gianni Points 6186
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()

sortie

t h i s   i s   t h e   s t r i n g

Dataclass in 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()

sortie

H e l l o

-1voto

TL;DR
Modifier le code source.

Explication complète
Si vous connaissez le langage C, vous pouvez modifier les fonctions en bifurquant le dépôt Python et en modifiant le fichier souhaité dans le dossier Objects. Ensuite, lisez le fichier README.rst pour les instructions de construction.

-2voto

totochto Points 1

La sous-classe est la voie à suivre en Python. Les programmeurs polyglottes apprennent à utiliser le bon outil pour la bonne situation - dans la mesure du possible. Quelque chose d'aussi habilement construit que Rails (un DSL utilisant Ruby) est douloureusement difficile à implémenter dans un langage ayant une syntaxe plus rigide comme Python. Les gens comparent souvent les deux en disant à quel point ils se ressemblent. La comparaison est quelque peu injuste. Python brille à sa manière. totochto.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X