Klassen-Attribute mit einem „berechnet“ name
-
06-09-2019 - |
Frage
Wenn Klasse definiert Attribute durch "berechnet" Namen, wie in:
class C(object):
for name in (....):
exec("%s = ..." % (name,...))
gibt es eine andere Art und Weise die zahlreichen Attributdefinitionen der Handhabung als durch einen exec? getattr (C, Name) funktioniert nicht, da C nicht definiert ist, während des Unterrichts Konstruktion ...
Lösung
Wie wäre:
class C(object):
blah blah
for name in (...):
setattr(C, name, "....")
Das heißt, tut das Attribut Einstellung nach der Definition.
Andere Tipps
class C (object):
pass
c = C()
c.__dict__['foo'] = 42
c.foo # returns 42
Wenn Sie Ihre gesamte Klasse wird „berechnet“, kann dann schlage ich die type
aufrufbar. Dies ist besonders nützlich, wenn Ihre Originalbehälter war ein dict:
d = dict(('member-%d' % k, k*100) for k in range(10))
C = type('C', (), d)
Dies würde Ihnen die gleichen Ergebnisse wie
class C(object):
member-0 = 0
member-1 = 100
...
Wenn sich Ihre Bedürfnisse sehr komplex sind, sollten metaclasses. (In der Tat, type
ist ein metaclass =)
Was ist metaclasses für diesen Zweck verwenden?
Sehen Sie sich Frage 100003: Was für ein Metaklasse in Python ist ?.