Variable in class: self?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
vegan
User
Beiträge: 12
Registriert: Freitag 13. Dezember 2013, 15:30

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?
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.
vegan
User
Beiträge: 12
Registriert: Freitag 13. Dezember 2013, 15:30

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?
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.
vegan
User
Beiträge: 12
Registriert: Freitag 13. Dezember 2013, 15:30

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?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@vegan: das kann man so nicht sagen:

Code: Alles auswählen

>>> class Bla:
...     foo = []
... 
>>> a = Bla()
>>> a.foo is Bla.foo
True
vegan
User
Beiträge: 12
Registriert: Freitag 13. Dezember 2013, 15:30

Cool, gut zu wissen.
Das sind sehr wichtige Informationen und hat mir sehr weiter geholfen.
Vielen, vielen Dank.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Antworten