auf statische Variable zugreifen

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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 ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Verwende einfach self.static
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das funktioniert aber nur mit lesen und geht nicht in statischen Methoden, was sollte man dann dort zum schreiben/setzen benutzen?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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`.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Klassenattribute sollte man möglichst gar nicht verändern, erst recht nicht von Instanzen aus.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es mutet auf jeden Fall recht magisch an. Ich hätte bei so etwas ebenfalls Bauchschmerzen.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten