Seite 1 von 1
Variable in class: self?
Verfasst: Donnerstag 19. Dezember 2013, 20:13
von vegan
Ein fröhliches holliridö liebes python-forum.de/Foren-Übersicht/Python Programmierforen/Allgemeine Fragen
ich habe mal eine Verständnissfrage.
Ich habe mich in den letzten Tagen eingehend mit dem Konzept von Klassen beschäftigt und bin jetzt noch auf etwas gestoßen was ich nicht ganz begreife.
Wenn ich eine Klasse erzeuge, dann weise ich doch jeder Variablen in der Klasse "self." zu, als Platzhalter für jede jeweilige Instanz dieser Klasse, damit ich diese Variable an alle Methoden meiner Klasse weitergeben kann.
Bsp:
Code: Alles auswählen
class Blablabla:
def methodeA(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
Ich bin jetzt auf
diesen Thread gestoßen, wo es darum geht alle Instanzen einer Klasse zu finden. Das Skript an sich versteh ich prinzipiell aber was ich noch nich ganz peil ist die erste Variable instances = []. Müsste es nicht eigentlich self.instances = [] heißen, damit diese Variable auch weiter verarbeitet werden kann?
Re: Variable in class: self?
Verfasst: Donnerstag 19. Dezember 2013, 20:31
von BlackJack
@vegan: Nein denn zu dem Zeitpunkt und in dem Namensraum gibt es überhaupt gar kein `self`. Das ist ja nicht in einer Methode definiert, sondern auf Klassenebene und dort existiert das Attribut dann auch. Das gibt es nicht auf den einzelnen Exemplaren, sondern einmal für alle Exemplare auf der Klasse.
Re: Variable in class: self?
Verfasst: Donnerstag 19. Dezember 2013, 20:52
von vegan
Also wenn ich eine Variable in einer Klasse ausserhalb einer Methode erstelle dann ist sie automatisch für die gesamte Klasse gültig?
Wie sieht es aus, wenn ich diese Variable ausserhalb der Klasse weiterverwenden will. Wenn ich mir zum Beispiel ausserhalb der Klasse Blablabla eine Funktion definiere, in der ich eine Variable aus der Klasse Blablabla verwenden möchte. Muss ich die Variable irgendwie speziell übergeben oder steht sie automatisch zur Verfügung?
Re: Variable in class: self?
Verfasst: Donnerstag 19. Dezember 2013, 21:25
von BlackJack
@vegan: Alles was Du auf Klassenebene definierst ist sowohl über die Klasse als auch über Exemplare verfügbar. Ganz normal als Attribut.
Variablen sollte man da aber in der Regel nicht speichern. Es gibt nur sehr wenige Fälle wo das Sinn macht. Üblicherweise setzt man dort Konstanten die zu dem Datentyp gehören.
Re: Variable in class: self?
Verfasst: Donnerstag 19. Dezember 2013, 23:02
von vegan
BlackJack hat geschrieben:@vegan: Alles was Du auf Klassenebene definierst ist sowohl über die Klasse als auch über Exemplare verfügbar. Ganz normal als Attribut.
Ok, das klingt recht logisch aber eins zum Verständniss.
In dem oben verlinkten Beispiel ist instances ja nicht mit self. deklariert somit immer für die gesamte Klasse zuständig und nicht instanzierbar.
Das heißt wenn ich die Variable instances an eine andere Funktion (ausserhalb der Klasse) übergebe dann müsste ich dass immer mit Klasse selbst machen und nicht mit einer Instanz, richtig?
Also das ist richtig:
Code: Alles auswählen
class Bla:
instances = [] # Liste aller Instanzen der Klasse
def __init__(self): # Fügt neue Instanz automatisch der Liste instaces zu
self.instances.append(self)
def foo(self): # Irgendeine Methode
#irgendwas
def bar(self): # Irgendeine Methode
#irgendwas
a = Bla()
b = Bla()
def myfunc():
alleInstazen = Bla.instances #Übergabe von instances an myfunc()
und das ist falsch:
Code: Alles auswählen
class Bla:
instances = [] # Liste aller Instanzen der Klasse
def __init__(self): # Fügt neue Instanz automatisch der Liste instaces zu
self.instances.append(self)
def foo(self): # Irgendeine Methode
#irgendwas
def bar(self): # Irgendeine Methode
#irgendwas
a = Bla()
b = Bla()
def myfunc():
alleInstazen = a.instances #Übergabe von instances an myfunc()
Kann man das so sagen?
Re: Variable in class: self?
Verfasst: Donnerstag 19. Dezember 2013, 23:10
von Sirius3
@vegan: das kann man so nicht sagen:
Code: Alles auswählen
>>> class Bla:
... foo = []
...
>>> a = Bla()
>>> a.foo is Bla.foo
True
Re: Variable in class: self?
Verfasst: Donnerstag 19. Dezember 2013, 23:41
von vegan
Cool, gut zu wissen.
Das sind sehr wichtige Informationen und hat mir sehr weiter geholfen.
Vielen, vielen Dank.
Re: Variable in class: self?
Verfasst: Donnerstag 19. Dezember 2013, 23:47
von cofi
Sofern man ueber folgendes Verhalten verwundert ist, sollte man davon aber die Finger lassen.
Code: Alles auswählen
In [5]: class Bla(object):
x = 23
def up(self):
self.x += 1
...:
In [6]: b = Bla()
In [7]: b.x is Bla.x
Out[7]: True
In [8]: b.up()
In [9]: b.x is Bla.x
Out[9]: False