Il y a de nombreuses étapes que les tutoriels pour débutants ne couvrent pas, je vais donc essayer d'être bref mais complet. J'essaierai d'être précis dans ma terminologie, afin que vous puissiez rechercher toutes les sections qui ne sont pas claires pour vous.
En général, méthodes en Python sont des fonctions dans le objet de classe . Toutes les fonctions sont descripteurs . Une partie de ce qu'être un descripteur signifie que lorsque vous accédez à une méthode par le biais de l'option instance d'une classe, il crée un fermeture qui transmet automatiquement l'instance sur laquelle vous l'avez créé en tant que self
paramètre. Par exemple, si Cars
avait un méthode start(self)
en plus de __init__
entonces tesla.start
serait un "méthode liée" qui est une fermeture qui passe tesla
como self
a Cars.start
. Remarquez que je n'ai pas mis de parenthèses après tesla.start
. En mettant des parenthèses, on invoquerait en fait la méthode bound.
Deuxième information : si une classe définit une __call__
méthode spéciale ses instances sont dites Appelable . Cela signifie que vous pouvez invoquer une instance comme s'il s'agissait d'une fonction en utilisant la commande ()
opérateur. Vous pouvez voir un cas de ce genre lorsque vous faites tesla = Cars(...)
. Ici Cars
est un objet de classe, mais vous l'appelez comme s'il s'agissait d'une fonction. Nous nous rapprochons maintenant de l'endroit où self
est en fait transmis à __init__
.
Troisièmement, à peu près tout en Python est un objet et obéit aux règles générales que vous connaissez pour les objets, comme être créé à partir d'une classe, etc. Cela inclut fonctions y classes . Un objet de classe est créé à partir d'une autre classe, qui est nommée de manière appropriée une métaclasse . Normalement métaclasses sont une boîte de Pandore qu'il vaut mieux ne pas ouvrir. Nous ne ferons donc qu'effleurer la surface, sans plus. Le plus courant métaclasse es type
: 99% 1 de tous les objets de classe que vous rencontrerez en tant que débutant comme des instances de type
. type
définit un __call__
qui est ce que vous invoquez quand vous faites Cars(...)
ya que Cars
est une instance de type
.
type.__call__(Cars, ...)
fait plusieurs choses. D'abord, il appelle Cars.__new__(Cars, ...)
. Cela renvoie la nouvelle instance que vous finirez plus tard par assigner à tesla
o ford
ou autre. Puis si la chose qui __new__
retourné est une instance de Cars
il appellera Cars.__init__(self, ...)
, donde self
est la nouvelle instance qu'il vient de créer.
Et c'est ainsi que self
est transmis à __init__
. Gardez à l'esprit que toutes les étapes peuvent être personnalisé ou surchargés, il ne s'agit donc que d'un aperçu de base du cas le plus simple.
Les liens figurant dans ce texte devraient vous permettre de commencer des recherches plus spécifiques. Tous les liens sont complètement distincts, même lorsqu'ils concernent le même terme. Tous les liens renvoient à des sites Stack Exchange (SO à une exception près), ou à la documentation officielle de Python 3, à une exception près.
1 J'ai inventé cette statistique, mais elle est probablement juste de toute façon.