إنشاء اسم متغير بشكل حيوي
سؤال
لدي هذا الرمز لإنشاء واجهة وبعض الأزرار (python in maya)
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]))
وأود تحويله إلى شيء مثل هذا لإنشاء الأزرار تلقائيًا ومعرفة أسمائها (حتى أتمكن من الاستعلام عنها لاحقًا)
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)
أواجه حقًا مشاكل في فهم كل هذا "الذات". سير العمل ، لذلك ربما أفتقد شيئًا أساسيًا ولكن كل ما جربته حتى الآن لم ينجح: S
شكرًا!
المحلول
إنها مجرد مشكلة في بناء الجملة.السمات المحددة في بناء الجملة يجب أن تكون معرفات، إذا كنت تريد السمات التي تم إنشاؤها فسوف تحتاج إلى استخدامها getattr
أو setattr
(أو delattr
):
for attr, nice in zip(attrs, niceAttrs):
setattr(self, attr, value)
يستبدل value
بالقيمة التي تريدها.هذا حقا لا علاقة له self
: self
هي مجرد وسيطة دالة أخرى وتتصرف مثل أي متغير آخر.
نصائح أخرى
ماذا عن setattr
?
class Foo:
def __init__(self):
# Set attribute "bar" on this object to the number 1
setattr(self, "bar", 1)
لا تنتمي إلى StackOverflow