динамическое создание имени переменной - PullRequest
1 голос
/ 12 января 2012

У меня есть этот код для создания интерфейса и некоторые кнопки (Python в 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

спасибо!

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Как насчет setattr?

class Foo:
    def __init__(self):
        # Set attribute "bar" on this object to the number 1
        setattr(self, "bar", 1)
2 голосов
/ 12 января 2012

Это просто проблема синтаксиса. Атрибуты, указанные в синтаксисе, должны быть идентификаторами, если вы хотите сгенерированные атрибуты, вам нужно использовать getattr или setattr (или delattr):

for attr, nice in zip(attrs, niceAttrs):
    setattr(self, attr, value)

Замените value нужным значением. Это действительно не имеет ничего общего с self: self - это просто еще один аргумент функции и ведет себя как любая другая переменная.

...