Klassenattribut

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
antimicro
User
Beiträge: 151
Registriert: Sonntag 29. Februar 2004, 16:24

Dienstag 27. Juni 2006, 23:45

Hi,
ich hab mal ein wenig mit Klassenattributen rumgespielt (aufmerksam durch diesen Thread).

Code: Alles auswählen

class Bspl:
    zeahler = 0
    
    def __init__(self):
        self.zeahler += 1
        print "Es gibt jetzt %d Objekte der Klasse Bspl"%self.zeahler

if __name__ == "__main__":
    obj1 = Bspl()
    obj2 = Bspl()
Sollte nicht das Klassenattribut eben Klassenübergreifend verändert werden. Wie beispielsweise in C :?:
Zuletzt geändert von antimicro am Mittwoch 28. Juni 2006, 08:18, insgesamt 1-mal geändert.
greetings
sebi
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 28. Juni 2006, 06:08

antimicro hat geschrieben:Sollte nicht das Klassenattribut eben Klassenübergreifend verändert werden. Wie beispielsweise in C :?:
Nein. Aber so:

Code: Alles auswählen

class Bspl:
    zeahler = 0
    
    def __init__(self):
        self.__class__.zeahler += 1
        print "Es gibt jetzt %d Objekte der Klasse Bspl"%self.anzeige

if __name__ == "__main__":
    obj1 = Bspl()
    obj2 = Bspl()
TUFKAB – the user formerly known as blackbird
antimicro
User
Beiträge: 151
Registriert: Sonntag 29. Februar 2004, 16:24

Mittwoch 28. Juni 2006, 08:18

Aha!
Sehr schön... vielen Dank!
greetings
sebi
BlackJack

Mittwoch 28. Juni 2006, 17:23

`self.__class__` ist keine gute Idee, bzw. sollte man wissen was das bei Subklassen für Auswirkungen hat:

Code: Alles auswählen

In [3]: class A(object):
   ...:         count = 0
   ...:     def __init__(self):
   ...:             self.__class__.count += 1
   ...:

In [4]: class B(A):
   ...:         def __init__(self):
   ...:             A.__init__(self)
   ...:

In [5]: a = A()

In [6]: print A.count
1

In [7]: b = B()

In [8]: print A.count, B.count
1 2
Das ist vielleicht nicht das Ergebnis was man erwarten würde. Alternativ:

Code: Alles auswählen

In [15]: class A(object):
   ....:         count = 0
   ....:
   ....:     def __init__(self):
   ....:             A.count += 1
   ....:

In [16]: class B(A):
   ....:         def __init__(self):
   ....:             A.__init__(self)
   ....:

In [17]: a = A()

In [18]: print A.count
1

In [19]: b = B()

In [20]: print A.count, B.count
2 2
Antworten