Dynamisches Erstellen eines Variablennamens
Frage
Ich habe diesen Code, um eine Schnittstelle und einige Schaltflächen (Python in Maya) zu erstellen.
class mrShadowMapChangerUI:
def __init__(self):
smAttrs = ['shadowMap','smapResolution','smapSamples','smapSoftness','smapBias']
smNiceAttrs = ['Active','Resolution','Samples','Softness','Bias']
attrs = zip(smAttrs,smNiceAttrs)
self.form = mc.columnLayout()
self.smapResolutionField = mc.textFieldButtonGrp( label=attrs[1][1], text=int(defaultLightValues[1]), bc=Callback(self.setSmValue, attrs[1][0]))
self.smapSamplesField = mc.textFieldButtonGrp( label=attrs[2][1], text=int(defaultLightValues[2]), bc=Callback(self.setSmValue, attrs[2][0]))
self.smapSoftnessField = mc.textFieldButtonGrp( label=attrs[3][1], text=('%.3f' % defaultLightValues[3]), bc=Callback(self.setSmValue, attrs[3][0]))
self.smapBiasField = mc.textFieldButtonGrp( label=attrs[4][1], text=('%.3f' % defaultLightValues[4]), bc=Callback(self.setSmValue, attrs[4][0]))
und ich möchte es auf so etwas umstellen, um die Schaltflächen automatisch zu erstellen und ihre Namen zu kennen (damit ich sie später abfragen kann)
class mrShadowMapChangerUI:
def __init__(self):
smAttrs = ['shadowMap','smapResolution','smapSamples','smapSoftness','smapBias']
smNiceAttrs = ['Active','Resolution','Samples','Softness','Bias']
attrs = zip(smAttrs,smNiceAttrs)
self.form = mc.columnLayout()
for attr in attrs:
self.('%s' % attr[0]) = mc.textFieldButtonGrp( label=attr[1], text=int(defaultLightValues[1]), bc=Callback(self.setSmValue, attr[0]))
mc.showWindow(self.window)
Ich habe wirklich Probleme, all dieses "Selbst" zu verstehen.Workflow, daher fehlt mir wahrscheinlich etwas Grundlegendes, aber alles, was ich bisher versucht habe, hat nicht funktioniert: S
danke!
Lösung
Es ist nur ein Syntaxproblem.In der Syntax angegebene Attribute müssen Bezeichner sein. Wenn Sie generierte Attribute möchten, müssen Sie getattr
oder setattr
(oder delattr
) verwenden:
for attr, nice in zip(attrs, niceAttrs):
setattr(self, attr, value)
Ersetzen Sie value
durch den gewünschten Wert.Dies hat wirklich nichts mit self
zu tun: self
ist nur ein weiteres Funktionsargument und verhält sich wie jede andere Variable.
Andere Tipps
Wie wäre es mit setattr
?
class Foo:
def __init__(self):
# Set attribute "bar" on this object to the number 1
setattr(self, "bar", 1)