Seite 1 von 1

Klassenattribut

Verfasst: Dienstag 27. Juni 2006, 23:45
von antimicro
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 :?:

Re: Klassenattribut

Verfasst: Mittwoch 28. Juni 2006, 06:08
von mitsuhiko
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()

Verfasst: Mittwoch 28. Juni 2006, 08:18
von antimicro
Aha!
Sehr schön... vielen Dank!

Verfasst: Mittwoch 28. Juni 2006, 17:23
von BlackJack
`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