Hi!
@Gromit: Nicht schlecht! Gefällt mir.
Hier ein etwas primitiveres Beispiel:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# NewStyle-Klasse mit **Slots**. Es können nur Klassenattribute verwendet
# werden, die in **__slots__** definiert wurden. So schützt man sich vor
# Schreibfehlern und die Klasse wird schneller.
class GemeinsameDaten(object):
# Jede mögliche Variable als Slot definieren (das bringt Sicherheit)
__slots__ = ("x", "y", "farbe")
def __init__(self):
"""Die Variablen vorbereiten"""
self.x = None
self.y = None
self.farbe = None
def __repr__(self):
"""
Die Variablen als String-Repräsentation zurück geben
(Das war nur die Fleißaufgabe ;-) -- es geht auch ohne.)
"""
values = [
"'%s': %s" % (var, repr(getattr(self, var)))
for var in self.__slots__
]
return "{%s}" % ", ".join(values)
class A:
def __init__(self, gemdat):
self.gemdat = gemdat
# Die Klasseninstanz mit den gemeinsamen Daten wird einfach
# als Parameter uebergeben. So spart man sich das unangenehme
# und fehleranfaellige arbeiten mit globalen Variablen.
gemdat = GemeinsameDaten()
a = A(gemdat)
b = A(gemdat)
a.gemdat.x = 10
a.gemdat.y = 10
print "b:", b.gemdat
b.gemdat.x = 8
b.gemdat.farbe = "Gelb"
print "a:", a.gemdat
print "b:", b.gemdat
Code: Alles auswählen
b: {'x': 10, 'y': 10, 'farbe': None}
a: {'x': 8, 'y': 10, 'farbe': 'Gelb'}
b: {'x': 8, 'y': 10, 'farbe': 'Gelb'}
Hier das gleiche Beispiel, vereinfacht, noch einmal. Dafür wurde die Methode **__repr__** weggelassen, da sie die Klasse komplizierter macht. Das ist nicht gut, wenn man eigentlich etwas anderes erklären möchte.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class GemeinsameDaten(object):
__slots__ = ("x", "y", "farbe")
def __init__(self):
"""Die Variablen vorbereiten"""
self.x = None
self.y = None
self.farbe = None
class A:
def __init__(self, gemdat):
self.gemdat = gemdat
gemdat = GemeinsameDaten()
a = A(gemdat)
b = A(gemdat)
a.gemdat.x = 10
a.gemdat.y = 10
print "b:", b.gemdat.x, b.gemdat.y, b.gemdat.farbe
b.gemdat.x = 8
b.gemdat.farbe = "Gelb"
print "a:", a.gemdat.x, a.gemdat.y, a.gemdat.farbe
print "b:", b.gemdat.x, b.gemdat.y, b.gemdat.farbe
mfg
Gerold
(Suchworte: gemeinsam, gemeinsame, Variable, Variablen, global, globale, vermeiden, Klasse, teilen)