Seite 1 von 2

Verfasst: Donnerstag 12. Mai 2005, 21:55
von BlackJack
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.

Verfasst: Donnerstag 12. Mai 2005, 22:12
von CM
Der Punkt geht an Dich - trotz Haarspalterei :D .

Verfasst: Freitag 13. Mai 2005, 11:53
von Gast
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

Verfasst: Freitag 13. Mai 2005, 17:47
von Leonidas
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.

Verfasst: Freitag 13. Mai 2005, 17:59
von Gast
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

Verfasst: Samstag 14. Mai 2005, 00:33
von BlackJack
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