Habe
es mal an deine gewüschte Form angepasst, aber um das Template-Objekt kommt ich nicht herum, da dieses die Flags mit ihren Werten verwaltet und ein FlagObject nur ob sie Wahr oder Falsch sind.
So würde es funktionieren:
Code: Alles auswählen
template = make_flags_type("spam", "eggs")
flags = template()
flags.foo = True
flags.bar = True
print flags
print int(flags)
Wobei "spam" und "eggs" nicht sein müssen, diese dienen lediglich der Veranschaulischung, das die Flags dynamisch angehangen werden können.
Edit:
snafu hat geschrieben:Ein Setzen von ``False`` müsste das Attribut ja dann mit ``0`` belegen, oder?
Wie mir scheint, hast du noch nicht ganz verstanden was ich eigentlich mache. Nur noch mal kurz zur Erklärung. Es gibt zwei Objekte das erste ist ein Template-Objekt, welches nur die Flag-Namen und deren Werte(1,2,4,8,...) enthält. Also wie ein "enum" fungiert(könnte man sogar von einer enum-Implementation ableiten um etwas mehr funktionalität zu haben). Als zweites habe ich das FlagObject, dieses hat das interne Attribute "_flags", welches den genauen Wert des Flag-Objektes abbildet. Dieses kann frei manipuliert werden und ist im Prinzip lediglich ein Integer. Lediglich die erweiterte Methoden zum Bearbeiten machen diese Klasse erst *Sinnvoll*.
Ein weiterer Vorteil ist, das man von dem Template-Objekt beliebig viele Instanzen haben und nutzen kann, welche alle die gleichen Flags kennen, aber unterschiedlich gesetzt sind. Hatte BlackJack in seinem Beispiel oben vorgeführt.