Où est écrit le processus d'instanciation python?

Lors de l'initialisation d'une instance avec python, elle est souvent décrite dans une méthode spéciale appelée __init __ (), mais l'instance n'est pas créée ici. Tout en confirmant ce fait, découvrons où est écrit le processus de création d'une instance.

** Environnement d'exécution **

Nom Version
python 3.4.3
ipython 3.1.0

new est exécuté avant init

class Foo():
    def __init__(self):
        print('init')
        print('self = %s' % self)

Foo()
# => 
# init
# self = <__main__.Foo object at 0x10dacb9b0> 

L'écriture de Class () appellera la méthode spéciale __init__ de cette classe. Ceci est une méthode d'instance. La raison en est qu'il prend soi-même comme argument, c'est-à-dire comme instance. Puisque le nom de la variable self n'est pas fixé dans la grammaire, d'autres noms peuvent être utilisés, mais il semble qu'il soit habituellement utilisé comme self.

Alors, où cette instance est-elle créée? Tout d'abord, supprimons new qui est exécuté avant __init __ ().

[Document officiel](http://docs.python.jp/3.4/reference/datamodel.html?highlight=%E7%89%B9%E6%AE%8A%E3%83%A1%E3%82%BD% E3% 83% 83% E3% 83% 89 # specialnames) indique que __new__ () sera appelé pour créer une nouvelle instance. Et ce __new__ () est automatiquement défini au moment de la création de la classe même s'il n'est pas spécifié.

class Foo():
    def __init__(self):
        pass

foo = Foo()
`__new__' in dir(foo)
# =>  True

Vous pouvez également voir dans la documentation officielle que ce __new __ () est exécuté avant le __init __ ().

Si new () renvoie une instance de cls, l'instance init () est appelée comme init (self [, ...]). À ce stade, self est l'instance nouvellement créée et les arguments restants sont les mêmes que ceux passés à new (). 3. Modèle de données - Python 3.4.3 Documents </ cite>

Cela peut être confirmé dans le code source ci-dessous.

class Foo():
    def __new__(cls, var1):
        print('new')
        print('var1 = %s' % var1)
        return super().__new__(cls)

    def __init__(self, var1):
        print('init')
        print('self = %s' % self)
        print('var1 = %s' % var1)

Foo('my_value')
# => 
# new
# var1 = my_value
# init
# self = <test.Foo object at 0x103bd0208> 
# var1 = my_value * Jusqu'ici, c'est print()C'est la sortie en.
#<test.Foo at 0x103bd0208> 

super () appelle la classe parente. Cette fois, l'instanciation est laissée à la classe parente. Puisqu'il remplace __new__ (), j'ai utilisé super (). __ new__ (cls) pour écrire moi-même le processus de création explicite de l'instance.

Où sont les méthodes héritées?

Même si vous ne remplacez pas __new__ (), si vous laissez la création de l'instance à la classe parent __new__ (), le processus d'instanciation réel est écrit dans l'objet __new__ () de tous les objets de classes parentes. Ça sera fait. Alternativement, le processus d'instanciation peut être écrit dans «new ()» de chaque classe.

Je ne savais toujours pas où le processus d'instanciation était écrit. Cependant, j'ai trouvé que ** Class () appelait __new__ **.

Pour confirmer que ce processus __new__ () est écrit, exécutez-le sans ajouter de parenthèses () au nom de la méthode.

class Super():
    @classmethod
    def hello(cls):
        print('super hello')

    @classmethod
    def say(cls):
        print('super say')

class Sub(Super):
    @classmethod
    def hello(cls):
        print('super hello')

#Vérifiez la méthode que vous avez définie et la classe dans laquelle elle est définie
Super.hello
# => <bound method type.hello of <class 'test.Super'> > 
Sub.hello
# => <bound method type.hello of <class 'test.Sub'> > 

#Si non annulé
Sub.say
# => <bound method type.say of <class 'test.Sub'> > 

Super.__new__
# => <function object.__new__> 
Super.__init__
# => <slot wrapper '__init__' of 'object' objects> 
Super.__le__
# => <slot wrapper '__le__' of 'object' objects> 

Non seulement __new__, mais d'autres méthodes spéciales elles-mêmes sont définies par objet. Il s'avère que tous les objets sont laissés à l'objet pour être instanciés, sauf s'ils sont remplacés.

Recommended Posts

Où est écrit le processus d'instanciation python?
Obtenez automatiquement le port où Arduino est bloqué en Python
[Python] Qu'est-ce que @? (À propos des décorateurs)
[python] Quelle est la clé triée?
À quoi sert le trait de soulignement Python (_)?
[Python] La valeur écrite par Openpyxl est affichée sous forme d'exposant (E).
[Unix] Qu'est-ce que le processus zombie / processus orphelin?
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
[python] [meta] Le type de python est-il un type?
Définissez le nom du processus du programme Python
Python est facile
La réponse de "1/2" est différente entre python2 et 3
Qu'est-ce que wheezy dans l'image Docker Python?
Wagtail est le meilleur CMS pour Python! (Peut-être)
À propos de la différence entre "==" et "is" en python
Envoyer Gmail à la fin du processus [Python]
Ceci est le seul examen de base de Python ~ 1 ~
Ceci est le seul examen de base de Python ~ 2 ~
Qu'est-ce que python
Je suis nouveau sur Python. Pourriez-vous s'il vous plaît me dire où se trouve l'erreur?
Python est une instance
Ceci est le seul examen de base de Python ~ 3 ~
Obtenir la région dans laquelle AWS Lambda s'exécute
Exécutez le processus Blue Prism en utilisant Python (SOAP)
Qu'est-ce que Python
Autour de l'endroit où la valeur d'Errbot est stockée
Le processus d'installation d'Atom et de l'exécution de Python
Le datetime Python3 est plus rapide en spécifiant simplement le fuseau horaire
L'examen de base de la certification d'ingénieur Python 3 est-il vraiment facile?
Quel est l'attribut de domaine écrit dans la disposition de Plotly?
Trouvez la partie 575 de Wikipedia en Python
Electron est la meilleure solution pour le développement multi-plateforme de Python
Pourquoi le premier argument de la classe [Python] est-il self?
Utilisation de l'application LibreOffice en Python (1) Où sont les macros?
[Python] Assurez-vous que la fonction reçue est une fonction définie par l'utilisateur
python (2) nécessite self car la méthode est une méthode d'instance
python int est infini
Trouvez le maximum de Python
[Python] Qu'est-ce que Pipeline ...
le zen de Python
Démoniser un processus Python
[Python] Fractionner la date
[Python] Qu'est-ce que virtualenv
Quel est l'outil de visualisation Python le plus populaire après tout?
Je veux initialiser si la valeur est vide (python)
Test.py n'est pas reflété sur le serveur Web dans Python3.
Sortie "Dessiner fougère par programmation" dans le processus de dessin en Python
'De' == 'De' est faux! En fait, le deuxième "de" était composé de deux lettres. [Python]
[Python] Qui est exécuté en premier, variable de classe ou __init__?
Attacher au processus Python de la destination SSH et déboguer
[Python] Est-ce que l'objet nul mais non vide est Vrai ou Chute?
Le processus de création et d'amélioration du code Python orienté objet
Quelle est la version TLS par défaut du module de requêtes python?
Récupère le nom de la classe où la méthode est définie dans le décorateur
Installation des paramètres initiaux Mac-Python (pyenv) au plus vite
Les journaux ne sont plus générés après la suppression des journaux de processus Java