Variablen in Klassen

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
onkelhamu
User
Beiträge: 20
Registriert: Freitag 20. Oktober 2017, 21:07

Hallo,
ich hätte mal eine Verständnisfrage. Man kann ja in Klassen eine Variable mit:
a = ...
oder auch
self.a = ...
definieren.
Wo liegt denn der Unterschied? Kann man nur die mit self definierten von außen ansprechen und die anderen nicht verändern ist das richtig?
nezzcarth
User
Beiträge: 1756
Registriert: Samstag 16. April 2011, 12:47

Für die Beantwortung solcher Fragen ist der interaktive Python-Interpreter sehr
praktisch:

Code: Alles auswählen

In [1]: class Test: 
   ...:     a = list() 
   ...:     def __init__(self): 
   ...:         self.b = list() 
   ...:                                                                                                                

In [2]: first = Test()                                                                                                 

In [3]: second = Test()    

In [4]: dir(first)                                                                                                    
Out[4]: 
['__class__',
 ...
 'a',
 'b']
                                                                                      
In [5]: first.a                                                                                                        
Out[5]: []

In [6]: second.a                                                                                                        
Out[6]: []

In [7]: first.a.append(1)                                                                                              

In [8]: first.a                                                                                                        
Out[8]: [1]

In [9]: second.a                                                                                                       
Out[9]: [1]

In [10]: first.b                                                                                                        
Out[10]: []

In [11]: first.b.append(2)                                                                                             

In [12]: first.b                                                                                                       
Out[12]: [2]

In [13]: second.b                                                                                                      
Out[13]: []
Der Unterschied zwischen den beiden Varianten ist, dass man mit der ersten Klassenattribute erzeugt, während sich das mit 'self' angelegte Attribut auf die jeweilige Instanz bezieht. Verändern und ansprachen kann man bei. Aber Klassenattribute werden von allen Instanzen geteilt, was am Besten bei veränderbaren Datenypen wie Listen (muteables) sehen kann. Instanzattribute sind exklusiv für ein konkretes Objekt, das mittels einer Klasse erzeugt wurde.
onkelhamu
User
Beiträge: 20
Registriert: Freitag 20. Oktober 2017, 21:07

Au! Danke!
Hätt nen bösen Fehler geben können
Antworten