Dévoilement des différences entre les fonctions, les méthodes non liées et les méthodes liées
Considérez l'extrait de code suivant :
<code class="python">class A(object): def f1(self): pass a = A()</code>
La variable f1 peut se manifester sous trois formes distinctes :
Distinctions d'objet
Une fonction, définie par le mot-clé def ou lambda, subit une transformation lorsqu'elle est placée dans une instruction de classe. Dans Python 2, cette transformation crée une méthode non liée, un concept absent dans Python 3. L'accès à cette méthode sur une instance de la classe la transforme en une méthode liée, qui lie de manière transparente l'instance en tant que paramètre initial (self).
Exemple :
<code class="python">def f1(self): pass</code>
Ici, f1 est une fonction. En revanche, C.f1 est une méthode non liée :
<code class="python">class C(object): f1 = f1</code>
Invocation et transformation de méthode
Les méthodes non liées peuvent être converties en méthodes liées en y accédant sur une instance de leur type de classe :
<code class="python">C().f1</code>
ou en utilisant le protocole de descripteur :
<code class="python">C.f1.__get__(C(), C)</code>
Les fonctions peuvent être transformées manuellement en méthodes non liées :
<code class="python">import types types.MethodType(f1, None, C)</code>
Combiner ces techniques permet la création directe de méthodes liées :
<code class="python">types.MethodType(f1, None, C).__get__(C(), C)</code>
La distinction cruciale entre les fonctions et les méthodes non liées réside dans la conscience qu'a cette dernière de sa liaison de classe. Par conséquent, l’invocation ou la liaison d’une méthode indépendante nécessite une instance de son type de classe affilié.
Dans Python 3, la distinction entre les fonctions et les méthodes indépendantes est éliminée. Au lieu de cela, accéder à une fonction sur une instance de classe renvoie directement la fonction elle-même :
<code class="python">C.f1 is f1</code>
Équivalence de méthode
En résumé, les invocations suivantes sont équivalentes dans Python 2 et Python 3 :
<code class="python">f1(C()) C.f1(C()) C().f1()</code>
La liaison d'une fonction à une instance fixe efficacement son paramètre initial à l'instance, rendant la méthode liée analogue à l'expression lambda suivante :
<code class="python">lambda *args, **kwargs: f1(C(), *args, **kwargs)</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!