Wo ist der Python-Instanziierungsprozess geschrieben?

Wenn eine Instanz mit Python initialisiert wird, wird sie häufig in einer speziellen Methode namens "__init __ ()" beschrieben, aber die Instanz wird hier nicht erstellt. Lassen Sie uns herausfinden, wo der Prozess zum Erstellen einer Instanz geschrieben ist, während wir diese Tatsache bestätigen.

** Ausführungsumgebung **

Name Version
python 3.4.3
ipython 3.1.0

new wird vor init ausgeführt

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

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

Das Schreiben von Class () ruft die spezielle Methode __init__ dieser Klasse auf. Dies ist eine Instanzmethode. Der Grund ist, dass es sich selbst als Argument, dh als Instanz, nimmt. Der Variablenname self ist in der Grammatik nicht festgelegt, daher sind andere Namen in Ordnung, aber es scheint, dass er üblicherweise als self verwendet wird.

Wo wird diese Instanz erstellt? Zuerst unterdrücken wir new, das vor __init __ () ausgeführt wird.

[Offizielles Dokument](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) gibt an, dass __new__ () aufgerufen wird, um eine neue Instanz zu erstellen. Und dieses __new__ () wird zum Zeitpunkt der Klassenerstellung automatisch definiert, auch wenn es nicht angegeben ist.

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

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

Sie können auch in der offiziellen Dokumentation sehen, dass dieses "__new __ ()" vor dem "__init __ ()" ausgeführt wird.

Wenn new () eine Instanz von cls zurückgibt, wird die Instanz init () wie init (self [, ...]) aufgerufen. Zu diesem Zeitpunkt ist self die neu erstellte Instanz, und die verbleibenden Argumente sind dieselben wie die an new () übergebenen. 3. Datenmodell - Python 3.4.3 Dokumente </ cite>

Dies kann im folgenden Quellcode bestätigt werden.

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_Wert * Bis hierher wird gedruckt()Es ist die Ausgabe in.
#<test.Foo at 0x103bd0208> 

super () ruft die übergeordnete Klasse auf. Dieses Mal wird die Instanziierung der übergeordneten Klasse überlassen. Da es "new ()" überschreibt, habe ich "super (). __ new__ (cls)" verwendet, um den Prozess des expliziten Erstellens der Instanz selbst zu schreiben.

Wo sind die geerbten Methoden?

Selbst wenn Sie "new ()" nicht überschreiben, wird der eigentliche Instanziierungsprozess in das "new ()" aller übergeordneten Klassenobjekte geschrieben, wenn Sie die Instanzerstellung der übergeordneten Klasse "new ()" überlassen. Es wird gemacht. Alternativ kann der Instanziierungsprozess in "new ()" jeder Klasse geschrieben werden.

Ich wusste immer noch nicht, wo der Instanziierungsprozess geschrieben war. Ich fand jedoch, dass ** Class () __new__ ** aufrief.

Um zu bestätigen, dass die Verarbeitung dieses __new__ () geschrieben ist, können Sie es finden, indem Sie es ausführen, ohne dem Methodennamen Klammern () hinzuzufügen.

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')

#Überprüfen Sie die von Ihnen definierte Methode und die Klasse, in der sie definiert ist
Super.hello
# => <bound method type.hello of <class 'test.Super'> > 
Sub.hello
# => <bound method type.hello of <class 'test.Sub'> > 

#Wenn nicht überschrieben
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> 

Nicht nur "new", sondern auch andere spezielle Methoden selbst werden durch das Objekt definiert. Es stellt sich heraus, dass alle Objekte dem Objekt zur Instanziierung überlassen bleiben, sofern sie nicht überschrieben werden.

Recommended Posts

Wo ist der Python-Instanziierungsprozess geschrieben?
Holen Sie sich automatisch den Port, an dem Arduino in Python steckt
[Python] Was ist @? (Über Dekorateure)
[Python] Was ist der sortierte Schlüssel?
Wofür ist der Python-Unterstrich (_)?
[Python] Der von Openpyxl geschriebene Wert wird als Exponent (E) angezeigt.
[Unix] Was ist der Zombie-Prozess / Orphan-Prozess?
Was ist "Mahjong" in der Python-Bibliothek? ??
[Python] [Meta] Ist der Python-Typ ein Typ?
Legen Sie den Prozessnamen des Python-Programms fest
Python ist einfach
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Was ist im Docker Python-Image pfeifend?
Bachstelze ist das beste CMS für Python! (Vielleicht)
Über den Unterschied zwischen "==" und "is" in Python
Senden Sie Google Mail am Ende des Vorgangs [Python]
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
Was ist Python?
Ich bin neu in Python. Könnten Sie mir bitte sagen, wo der Fehler liegt?
Python ist eine Instanz
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Holen Sie sich die Region, in der AWS Lambda ausgeführt wird
Führen Sie den Blue Prism-Prozess mit Python (SOAP) aus.
Was ist Python?
Um den Ort, an dem der Wert von Errbot gespeichert ist
Der Prozess der Installation von Atom und der Ausführung von Python
Python3 datetime ist schneller, wenn nur die Zeitzone angegeben wird
Ist die Grundprüfung für die Python 3 Engineer-Zertifizierung wirklich einfach?
Was ist das Domain-Attribut, das in Plotlys Layout geschrieben ist?
Suchen Sie den Teil 575 aus Wikipedia in Python
Electron ist die beste Lösung für die plattformübergreifende Entwicklung von Python
Warum ist das erste Argument der [Python] -Klasse selbst?
[Python] Stellen Sie sicher, dass die empfangene Funktion eine benutzerdefinierte Funktion ist
Python (2) erfordert self, da die Methode eine Instanzmethode ist
Python Int ist unendlich
Finden Sie das maximale Python
[Python] Was ist Pipeline ...
der Zen von Python
Dämonisiere einen Python-Prozess
[Python] Teilen Sie das Datum
[Python] Was ist virtualenv?
Welches ist schließlich das beliebteste Python-Visualisierungstool?
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Test.py wird auf dem Webserver in Python3 nicht angezeigt.
Geben Sie "Farn programmgesteuert zeichnen" in den Zeichenprozess in Python ein
'De' == 'De' ist falsch! Eigentlich war das zweite "de" zwei Buchstaben. [Python]
[Python] Was wird zuerst ausgeführt, Klassenvariable oder __init__?
Anhängen an den Python-Prozess des SSH-Ziels und Debuggen
[Python] Ist das null, aber nicht leere Objekt wahr oder falsch?
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
Was ist die Standard-TLS-Version des Python-Anforderungsmoduls?
Rufen Sie den Klassennamen ab, in dem die Methode im Dekorator definiert ist
Mac Initial Settings-Python (pyenv) Installation am schnellsten
Nach dem Löschen von Java-Prozessprotokollen werden keine Protokolle mehr ausgegeben