hey danke dir
helduel hat geschrieben:
Code: Alles auswählen
class A(object):
def __new__(cls):
cls.counter = 0 # jede Klasse braucht ihre eigene counter-Variable
return object.__new__(cls)
def __init__(self):
self.__class__.counter += 1
self._count_bases(self.__class__.__bases__)
@classmethod
def _count_bases(cls, bases):
"""Counter fuer jede Superklasse erhoehen."""
for cls in bases:
try:
cls.counter += 1
except AttributeError:
pass
cls._count_bases(cls.__bases__)
class B(A): pass
class C(A): pass
class D(B): pass
das tut es schon fast, aber:
zeile 5 setzt den counter immer wieder auf 0.
daher kann jede klasse nur einmal instanziert werden.
habe versucht mit hasattr(cls, "counter") zu testen ob counter schon da ist. das trifft aber für B, C, D zu, falls A vorher instanziert wurde.
(kann man irgendwie feststellen, ob die variable der klasse selbst gehört und nicht geerbt wurde?)
zeile 20 crashed wenn die rekursion "object" erreicht.
habe das jetzt so:
Code: Alles auswählen
class A(object):
counter = 0
def __init__(self):
self.__class__.counter += 1
self._count_bases(self.__class__.__bases__)
@classmethod
def _count_bases(cls, bases):
"""Counter fuer jede Superklasse erhoehen."""
for cls in bases:
try:
cls.counter += 1
except AttributeError:
pass
if hasattr(cls, "_count_bases"):
cls._count_bases(cls.__bases__)
class B(A): counter = 0
class C(A): counter = 0
class D(B): counter = 0
funktioniert, aber schön ist das irgendwie nicht :/
EDIT:
das hasattr ist überflüssig, der rekursive aufruf kommt einfach in das try
Code: Alles auswählen
@classmethod
def _count_bases(cls, bases):
"""Counter fuer jede Superklasse erhoehen."""
for cls in bases:
try:
cls.counter += 1
cls._count_bases(cls.__bases__)
except AttributeError:
pass