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 |
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.
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