Klassenweite Variablen

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.
BlackJack

Beitragvon BlackJack » Donnerstag 12. Mai 2005, 21:55

Jetzt hat ihm immer noch niemand seine Ausgangsfrage beantwortet. Klassenweite Variablen bekommt man, in dem man sie auf der "Ebene" der Klasse definiert und über den Klassennamen referenziert:

Code: Alles auswählen

class Spam:
    counter = 0
    def __init__(self):
        Spam.counter += 1
        print 'Es wurden schon %d Spam-Instanzen erzeugt' % Spam.counter


Aber er wollte ja offensichtlich Instanzvariablen haben. :wink:

Ein Programm aus einer anderen Sprache in eine neue mehr oder weniger 1:1 übersetzen zu wollen produziert übrigens in vielen Fällen ziemlich hässlichen Quelltext. Wenn die Sprachen alle gleich funktionieren würden und die gleichen Idiome und Muster verfolgen würden, dann bräuchte man ja gar nicht erst verschiedene Sprachen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Donnerstag 12. Mai 2005, 22:12

Der Punkt geht an Dich - trotz Haarspalterei :D .
Gast

Beitragvon Gast » Freitag 13. Mai 2005, 11:53

hallo zusammen,

na ich weiss nicht, ob das beispiel von BlackJack gut ist, gut in dem sinne es nachzuahmen und darauf aufzubauen. klassenvariablen würde ich im konstruktor so nicht verändern.
besonders wenn es später um vererbung geht, kann das ungewünschte effekte bringen.

Bsp:

BlackJack's Variante, dann meine:

Code: Alles auswählen

>>> class Spam:
   counter=0
   def __init__(self):
      Spam.counter += 1
      print 'Es wurden schon %d Spam-Instanzen erzeugt' % Spam.counter

      
>>> spam=Spam()
Es wurden schon 1 Spam-Instanzen erzeugt
>>> Spam.counter
1
>>> spam.counter
1
>>> class Spam:
   counter=0
   def __init__(self):
      self.counter += 1
      print 'Es wurden schon %d Spam-Instanzen erzeugt' % self.counter

      
>>> spam=Spam()
Es wurden schon 1 Spam-Instanzen erzeugt
>>> Spam.counter
0
>>> spam.counter
1
>>>



will sicher nicht klugscheissen, sondern habe mir nur mal meine gedanken gemacht.


lg,

rolgal
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 13. Mai 2005, 17:47

Aber das Funktioniert doch so nicht:

Code: Alles auswählen

>>> Spam()
Es wurden schon 1 Spam-Instanzen erzeugt
>>> Spam()
Es wurden schon 1 Spam-Instanzen erzeugt

Es sollte aber zwei zeigen, insofern würde ich BlackJacks Variante nehmen, wenn ich will dass alle Klasseninstanzen die Variable sich teilen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Gast

Beitragvon Gast » Freitag 13. Mai 2005, 17:59

hi leonidas,

Aber das Funktioniert doch so nicht:


stimmt schon was du sagt, ich hatte an ein bsp. von mir gedacht, das ich programmiert habe und dachte, dass ich da in teufelsküche gekommen wäre,......naja dann wurde mir wieder klar, dass python ja soviele möglichkeiten bietet etwas anzugehen, dass ich nur einiges ändern müsste und es würde auch wieder laufen,

wahrscheinlich war es für mich einfach etwas seltsam zu sehen, dass eine klassenvariable im konstruktor der eine instanz erstellt in dieser weise verändert wird.

lg

rolgal
BlackJack

Beitragvon BlackJack » Samstag 14. Mai 2005, 00:33

Das mit dem Zähler von Instanzen ist das Beispiel in vielen Tutorials zum Thema Klassenvariablen. Ich hab's auch in der Praxis schon ein paar mal so verwendet um jeder Instanz eine eindeutige, laufende Nummer zu Verpassen:

Code: Alles auswählen

class Node:
    next_serial = 0
    def __init__(self):
        self.serial = Node.next_serial
        Node.next_serial += 1

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder