2016-08-04 22 views
0

Ich führe den folgenden sehr trivialen Python-Code. Ich bin sehr überrascht, dass es tatsächlich läuft. Könnte mir jemand erklären, warum ich sogar "nd" und "hel" Werte zuweisen kann, ohne sie in der Klassendefinition zu definieren? Liegt das daran, dass das Attribut in der Instanzenebene hinzugefügt werden kann?Warum funktioniert diese Verwendung einer Klasse in Python?

class tempClass(object): 

a = tempClass() 
a.nd = 1 
a.hel = 'wem3' 
+1

Die Art und Weise, wie Objekte entworfen wurden, ermöglicht das Erstellen von Attributen nach Zuweisung. Versuche dasselbe mit einer Funktion (Funktionen sind Objekte): definiere eine Funktion, '' 'f''', füge dann ein Attribut hinzu -' '' f.new = 1''' - es funktioniert :). '' '... kann in der Instanzenebene hinzugefügt werden?' '' Attribute können der Klasse selbst auf die gleiche Weise hinzugefügt werden. – wwii

+0

Danke, @wwii. Funktioniert das Hinzufügen einer Funktion anstelle eines Attributs zu einer Instanz einer Klasse? Ich versuchte es. Es hat nicht funktioniert. Aber vielleicht habe ich es nicht richtig gemacht. – Hans

+0

Definieren Sie die Funktion und weisen Sie dann dem Klassen- oder Instanzattribut den Funktionsnamen zu. '' 'def f(): drucken ('1'); tempClass.foo = f'''. – wwii

Antwort

2

Python hat keine Ahnung von Variablendeklaration, nur Zuweisungen. Gleiches gilt für Attribute: Sie vergeben einfach einen Anfangswert, um ihn zu erstellen.

Es gibt nichts Besonderes über die __init__ Methode in dieser Hinsicht. Beispiel:

class TempClass(object): 
    def __init__(self): 
     self.nd = 1 

a = tempClass() 
a.hel = 'wem3' 

Beide Attribute werden auf die gleiche Weise erstellt: durch Zuweisen eines Werts zu ihnen. __init__ wird aufgerufen, wenn a zuerst erstellt wird, aber ansonsten nicht speziell ist. self innerhalb __init__ ist eine Referenz auf das Objekt, das von a referenziert wird, also self.nd = 1 ist identisch mit a.nd = 1. Nachdem das Objekt erstellt wurde, wird a.hel erstellt und mit dem gleichen Prozess mit 'wem3' initialisiert.