Erbt Python spezielle Methoden?

** Ausführungsumgebung **

Ich überprüfe die Ausgabe auf dem Interpreter und lasse print () weg.

Name Version
python 3.4.3
ipython 3.1.0

Überprüfen Sie, was geerbt werden soll

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__

Wenn ich die Attribute der übergeordneten Klasse dynamisch ändere, wird dies in der untergeordneten Klasse wiedergegeben?

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.

Der geerbte Attributname ist ein Alias

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

Was ist mit der Namensauflösung von geerbten Attributnamen?

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,

Wenn du es nicht hältst

Wenn jemand es verstehen kann, lass es mich wissen.

Recommended Posts

Erbt Python spezielle Methoden?
Bequeme Methoden von Python usw.
Grundmethode der [Python] -Klasse
String-Objektmethoden in Python
Python-Version wechselt nicht
Rufen Sie Methoden in Python dynamisch auf
Python-Spezialcodec, der zu wissen scheint, aber nicht weiß
Definieren Sie Funktionen (Methoden) in Python dynamisch
[Python] Erbt eine Klasse mit Klassenvariablen
Python-Klassen und -Instanzen, Instanzmethoden