Que pouvons-nous faire avec les objets d'instance maintenant ? Les seules opérations que les objets d'instance incluent sont la référence aux attributs. Il existe deux types d'attributs valides : Attributs et méthodes de données.
Les attributs de données correspondent aux "variables d'instance" dans Smalltalk et aux "membres de données" en C++++. Les attributs de données n'ont pas besoin d'être déclarés ; comme les variables locales, ils prennent vie la première fois que quelque chose leur est assigné. Par exemple, en supposant que x est l'instance MyClass créée ci-dessus, le code suivant affichera la valeur 16 sans laisser de trace :
x.compteur = 1
tandis que x.compteur < 10 :
x.counter = x.counter * 2
imprimer (x.compteur)
de x.counter
L'autre type d'attribut d'instance est la méthode. Une méthode est une fonction qui appartient à un objet. (En Python, le terme méthode n'existe pas seulement pour les instances de classe : d'autres types d'objets peuvent aussi avoir des méthodes. Par exemple, les objets de la liste ont des méthodes appelées append(), insert(), insert(), insert(), remove(), sort(), etc. Cependant, dans la discussion qui suit, nous utilisons le terme méthode exclusivement dans le sens de méthodes d'objets d'instance de classe, sauf indication contraire.
La validité d'un attribut dépend de la classe. Par définition, tous les attributs qui sont un objet fonction définissent un objet méthode correspondant pour son instance. Par conséquent, dans notre exemple x.f est une référence valide à la méthode, puisque MyClass.f est une fonction, mais x.i ne l'est pas, puisque MyClass.i ne l'est pas. x.f n'est pas identique à MyClass.f - c'est un objet méthode et non une fonction.
Méthode objet
Habituellement, une méthode est appelée en fonction de son lien :
x.f()
Dans l'exemple de MyClass, la chaîne'Hello World' sera affichée. Cependant, vous n'avez pas besoin d'appeler une méthode directement : x.f est un objet de méthode et peut être enregistré et rappelé ultérieurement. Par exemple :
xf = x.f
alors que c'est vrai :
print(xf())
Cela passera le monde du bonjour jusqu'à la fin des temps.
- Que se passe-t-il exactement lorsque vous appelez une méthode ? Vous avez peut-être remarqué que x.f() était appelé sans argument en haut, même si un argument était spécifié dans la définition de fonction pour f(). Qu'est-il arrivé à cette discussion ? Bien sûr, Python provoque une exception si une fonction qui a besoin d'un argument est appelée sans lui - même si l'argument n'est pas réellement utilisé......
- En fait, comme vous l'avez deviné, la particularité des méthodes est que l'objet est passé comme premier argument de la fonction. Dans notre exemple, l'appel x.f() est l'équivalent exact de MyClass.f(x). En général, appeler une méthode avec n arguments équivaut à appeler la fonction correspondante avec une liste d'arguments créée en insérant l'objet méthode avant le premier argument.
Si vous ne comprenez toujours pas comment fonctionnent les méthodes, un coup d'œil à la mise en œuvre peut aider à clarifier les choses. Lorsque vous faites référence à un attribut d'instance qui n'est pas un attribut de données, sa classe est recherchée. Si le nom indique un attribut de classe valide qui est une fonction, un objet méthode est créé en combinant (pointeur vers) l'objet instance et l'objet fonction dans un objet abstrait : C'est l'objet méthode. Si l'objet méthode est appelé avec une liste d'arguments, il est à nouveau décompressé, une nouvelle liste d'arguments est créée à partir de l'objet instance et de la liste d'arguments originale et l'objet fonction est appelé avec cette nouvelle liste d'arguments.
Notes au hasard
Les attributs de données remplacent les attributs de méthode portant le même nom. Les conventions possibles comprennent la mise en majuscule des noms de méthodes, le préfixe des attributs de données avec de petites chaînes de caractères uniques (peut-être juste un tiret vers le bas), ou l'utilisation de verbes pour les noms de méthodes et les noms des attributs de données.
Les attributs de données peuvent être référencés par les deux méthodes et par les utilisateurs normaux ("clients") d'un objet. En d'autres termes, les classes ne peuvent pas être utilisées pour implémenter des types de données purement abstraits. En fait, en Python, il n'y a aucun moyen de forcer la dissimulation de données - tout est basé sur des conventions. (Par contre, l'implémentation Python, écrite en C, peut complètement cacher les détails de l'implémentation et contrôler l'accès à un objet si nécessaire ; ceci peut également être utilisé par des extensions Python écrites en C.)
Les clients doivent utiliser les attributs de données judicieusement, car ils peuvent briser les invariants traités par des méthodes qui piétinent leurs attributs de données.