** Ausführungsumgebung **
Ich überprüfe die Ausgabe auf dem Interpreter und lasse print () weg.
Name | Version |
---|---|
python | 3.4.3 |
ipython | 3.1.0 |
Als ich mit der speziellen Methode "__init __ ()" nachgesehen habe, habe ich bestätigt, dass die Superklasse "__init __ ()" in der undefinierten Unterklasse ausgeführt wurde. Vorsichtshalber überprüfen wir die Vererbung außer speziellen Methoden.
class Super():
super_class_var = 'super_class_value'
def __init__(self):
self.super_instance_var = 'super_instance_value'
@classmethod
def __super_class_method__(cls):
print('__super_class_method__')
def __super_instance_method__(self):
print('__super_instance_method__')
class Sub(Super):
pass
\#Überprüfen Sie die Klassenfelder
Sub.super_class_var
\# => 'super_class_value'
Sub.__super_class_method__
\# => <bound method type.__super_class_method__ of <class 'special_method.Sub'> >
Sub.__super_class_method__()
\# => __super_class_method__
\#Überprüfen des Instanzfelds
sub = Sub()
sub.super_instance_var
\# => 'super_instance_value'
sub.__super_instance_method__
\# => <bound method Sub.__super_instance_method__ of <special_method.Sub object at 0x10dcf0da0> >
sub.__super_instance_method__()
\# => __super_instance_method__
Die Antwort ist ja!
\#Bestätigen Sie im Unterricht
Super.new_var = 'new_var'
Sub.new_var
\# => 'new_var'
'new_var' in dir(Sub)
\# => True
\#Überprüfen Sie mit Instanz
sub = Sub()
sub.new_var
\# => 'new_var'
'new_var' in dir(sub)
\# => True
Selbst wenn Sie die Attribute der übergeordneten Klasse später im Interpreter ändern, wird sie von der untergeordneten Klasse erkannt.
Hat die untergeordnete Klasse Methoden geerbt, die von denen der übergeordneten Klasse getrennt sind? Lass es uns überprüfen. Der Quellcode ist eine Fortsetzung vom letzten Mal.
id(Super.__super_class_method__)
\# => 4381481672
id(Sub.__super_class_method__)
\# => 4381481672
id(sub.__super_class_method__)
\# => 4381481672
id(Super.__super_class_method__) ==\
id(Sub.__super_class_method__) ==\
id(sub.__super_class_method__)
\# => True
Die ID (Kennung) der Methode, auf die alle Attributnamen verweisen, war dieselbe. Sie können sehen, dass es nur ein Objekt für die Klassenmethode __super_class_method__
gibt. Der hier zu beachtende Punkt ist, dass der Attributname __super_class_method__
nicht derselbe ist, aber dieser Attributname, dh die ID des Objekts, auf das die Beschriftung zeigt, ist der gleiche. Lassen Sie uns dies im Quellcode überprüfen.
foo = '1'
id(foo)
\# => 4361922800
bar = foo
id(bar)
\# => 4361922800
id(foo) == id(bar)
\# => True
In diesem Experiment haben wir bestätigt, dass die spezielle Methode der übergeordneten Klasse ebenfalls vererbt wird. Ich habe auch den von mir definierten "Methodennamen" geerbt. Da dies und der spezielle Methodenname nur Bezeichnungen sind, sind sie hinsichtlich der Attributnamen identisch. Ich nenne es jedoch keine spezielle Methode, die ich definiert habe. Eine spezielle Methode ist eine Methode, die indirekt aufgerufen wird, ohne direkt "method ()" zu schreiben. Wenn Sie einen Operator wie +, -, <= ausführen, wird die entsprechende Spezialmethode ausgeführt. Daher ist es möglich, das Verhalten des Operators durch Umschreiben der speziellen Methode zu ändern. Einzelheiten entnehmen Sie bitte dem unten stehenden offiziellen Dokument.
[3. Datenmodell - Python 3.4.3-Dokument](http://docs.python.jp/3/reference/datamodel.html?highlight=%E7%89%B9%E6%AE%8A%E3%83% A1% E3% 82% BD% E3% 83% 83% E3% 83% 89 #specialnames)
Dieses Experiment löste die Frage ** "Erbt Python spezielle Methoden?" **. Es sind jedoch neue Fragen aufgetaucht.
Wenn Sie es halten,
super (). Methodenname ()
~~ Nachtrag: Dies bedeutet, dass die Methode der übergeordneten Klasse gehalten wird Dieses Experiment](http://program-blog.net/python/275/#i) bestätigt.Wenn du es nicht hältst
Wenn jemand es verstehen kann, lass es mich wissen.
Recommended Posts