5 votes

Se comprendre soi-même en interne en Python

Je comprends parfaitement ce que est transmis à self dans cet exemple. Je suis très confus sur comment il est transmis à self interne. Quelqu'un pourrait-il m'aider à comprendre ?

class Cars:

    def __init__(self, model, engine, doors):

        self.model = model
        self.engine = engine
        self.doors = doors

tesla = Cars('Model S', 'Electric', 'Four door')
ford = Cars('Mustang', 'v8', 'Two door')

9voto

Mad Physicist Points 3218

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.

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