Python-如何通过列表创建多个属性

时间:2018-08-27 15:29:52

标签: python python-2.7

如何通过列表创建多个属性,例如:

我的代码:

class test():
    def __init__(self, name):
       pass...
    def test2(self, lista):

但是在这种方法中,我创建了一个对象(列表的最后一个元素。 如何创建多个self.ris以生成多个对象?

2 个答案:

答案 0 :(得分:1)

使用setattr将属性名称设置为变量:

class pkg():
    def __init__(self, name):
            self.name = name
            lista_ = self.dai_lista(lista)
            print lista_
            for i in lista_:
                    i = i.rstrip()
                    setattr(self, 'ris'+i, riso(i))
    def dai_lista(self, lista):
            print "sono in dai lista"
            return lista

class riso():
        def __init__(self, nome):
                self.nome = nome
        def print_nome(self):
                print self.nome

lista = ['a', 'b', 'c' ]
pippo = pkg('pippo')
pippo.risa.print_nome()
pippo.risb.print_nome()
pippo.risc.print_nome()

输出:

sono in dai lista
['a', 'b', 'c']
a
b
c

但是,尽管这可行,但我还是认为动态创建实例属性是不明智的做法。相反,您应该使用字典来存储这些类:

class pkg():
    def __init__(self, name):
            self.name = name
            lista_ = self.dai_lista(lista)
            print lista_
            self.ris = {}
            for i in lista_:
                    i = i.rstrip()
                    self.ris[i] = riso(i)
    def dai_lista(self, lista):
            print "sono in dai lista"
            return lista

class riso():
        def __init__(self, nome):
                self.nome = nome
        def print_nome(self):
                print self.nome

lista = ['a', 'b', 'c' ]
pippo = pkg('pippo')
pippo.ris['a'].print_nome()
pippo.ris['b'].print_nome()
pippo.ris['c'].print_nome()

输出与您使用过的属性相同。

答案 1 :(得分:0)

您可以创建一个像这样的方法:

def make_attrs(self, *lista):
    for l in lista:
        setattr(self, l, None)

None将为您初始化值。如果要创建键值对,则可以创建字典:

myattrs = {'k': 'v',...}

def make_attrs(self, *args, **kwargs):
    for l in args:
        setattr(self, l, None)
    for k,v in kwargs.items():
        setattr(self, k, v)

通常,最好使用__init__方法执行此操作(我认为这是PEP标准,因此在这里可以让我保持诚实),但这是一种简单的方法