Seite 1 von 1

auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 15:40
von Xynon1
Wie sollte man auf ein *statische* Variable von einer abgeleiteten Klasse zugreifen?

Code: Alles auswählen

#/usr/bin/env python3
class A:
    static = 0

class B(A): 
    def print_(self):
        ...
Jetzt könnte man in print sowohl mit "self.static", "type(self).static", "B.static", "A.static" oder per "super().static" darauf zugreifen.

"self.static" - ist sicherlich nicht praktisch, denn wenn man sie so überschreibt setzt man ja ein Instanz-Attribute.
"type(self).static" - wäre das gleiche wie "A.static" oder "B.static" kann man aber nicht in einer statischen Methode benutzen.
"super().static" - greift auf "A.static" zurück, aber kann nicht in der Basis-Klasse verwendet werden
Bei "A.static" und "B.static" sehe ich keine Nachteile, außer das man den Klassennamen kennen muss und der ist ja klar.

Ich hoffe erstmal das ich das weitestgehend richtig verstanden habe und frage mich jetzt aber, was man nun am besten benutzen sollte. Bzw. sehe ich irgendwelche anderen Nachteile nicht ?

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 15:51
von DasIch
Verwende einfach self.static

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 15:59
von Xynon1
Das funktioniert aber nur mit lesen und geht nicht in statischen Methoden, was sollte man dann dort zum schreiben/setzen benutzen?

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 16:10
von snafu
@DasIch: Ein Verändern von `self.static` würde sich nur auf das Exemplar beziehen. `A.static` bliebe davon unberührt. Die Problemstellung ist hier wohl, wie man Klassenattribute am Besten verändert. Ich denke mal `A.static` ist schon der richtige Weg. Ich wüsste nichts anderes.

EDIT: Was auch ginge, ist `self.__class__.static`.

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 16:14
von DasIch
Klassenattribute sollte man möglichst gar nicht verändern, erst recht nicht von Instanzen aus.

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 16:21
von snafu
Es mutet auf jeden Fall recht magisch an. Ich hätte bei so etwas ebenfalls Bauchschmerzen.

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 16:28
von Xynon1
Ok dann spinn ich das ganze noch ein Stück weiter.

Code: Alles auswählen

#a.py
class A:
    static = 0

#b.py
import a
class B(a.A): pass

#c.py
import b
class C(b.B): 
    def func(self):
        ...
Sollte man in c.py jetzt extra nochmal a.py importieren um auf a.A.static zuzugreifen oder dann doch eher auf b.B.static zugreifen? Ich würde ja eher auf b.B.static zugreifen diese eventuell von der B-Klasse anders implemtiert sein könnte.

Keine Sorge ich komm jetzt nicht auf die komische Idee das zu bauen :) und das Verändern solche Klassenattribute würde ich auch tunlichst vermeiden. Es hat auch eigentlich keine Relevanz mich würde es nur interessieren, da ich gerade so einen ähnlichen Fall gesehen habe.

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 16:43
von Xynon1
Falls es jemanden interessiert wo ich das gesehen habe.
Das war bei dem Aufbau eines GUI-Toolkits für SDL. Wobei hier die Widget-Klasse so ulkig aufgebaut war, diese hat nämlich zeitgleich alle Widgets verwaltet. Also es wurde ein Klassenattribut "widgets" als Liste definiert in welchem alle gebauten Widgets hinzugefügt wurden. Also immer beim instazieren wurde dem Klassenattribute die Widget-Instanz angehangen.

Von dem Widget wird nun BaseContainer, davon Container und Window abgeleitet. Jede Instanz die gebaut wird wird in dem statischen Klassenattribut hinterlegt, so das alle Widgets immer über Widget.widgets verfügbar sind. Was ich davon halten soll weiß ich nicht, mir wirkt es eigentlich nicht zu magisch. Jedenfalls wurde damit erreicht, das man über die Widgets, ohne sie zu kennen, iterieren konnte und dann zeichnen.

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 17:12
von Darii
Xynon1 hat geschrieben:Sollte man in c.py jetzt extra nochmal a.py importieren um auf a.A.static zuzugreifen oder dann doch eher auf b.B.static zugreifen? Ich würde ja eher auf b.B.static zugreifen diese eventuell von der B-Klasse anders implemtiert sein könnte.
Kommt drauf an was du willst. Wenn du a.A.static haben möchtest solltes du nicht über b.B.static drauf zugreifen gerade weil b.B das überschreiben könnte.

Und wenn du das innerhalb der Klasse C verwenden willst, dann am besten über type(self).static oder self.static zugreifen (je nachdem was gewünscht ist), dann funktioniert das automatisch mit der Vererbung.

PS: Python kennt übrigens keine statischen Variablen/Methoden da Klassen auch vollwertige Objekte sind.

Re: auf statische Variable zugreifen

Verfasst: Freitag 27. Mai 2011, 18:07
von Xynon1
Das es keine statischen Variablen sind ist mir auch klar, deswegen hatte ich oben auch *statische* geschrieben. Das verhalten eines Klassen-Attributes kommt von der Handhabung einer statischen Variable aber sehr nahe. Ich fande halt nur den Aufbau der Widgets sehr interessant, war mal was anderes :D