如何使用Python中的循环将对象添加到类?

时间:2013-11-20 15:23:31

标签: python maya

我有一个看起来像这样的课。

class CharInStageList(object):
    def __init__(self, charid, charname) :
        self.charid = charid
        self.charname = charname

进入这个课程,我想添加我有的列表。

我知道如何以正常的方式做到这一点

charOne = CharInStageList(1,'Tim')
charTwo = CharInStageList(2,'Struppi')

这不是问题,我真正想要做的是使用循环添加它们。

我以这种形式获取我的数据

((1,'Tim'),(4,'Struppi'))

((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy'))

我在场景中的字符数总是不同的。 我想象的将是这样的循环

charlist = ((1,'Tim'),(4,'Struppi'))
for char in charlist
    objname = CharInStageList(char[0],char[1])

类似这样的事情

我希望objname能够为我添加到类中的每个对象自行更改。

我怎样才能得到这种效果。 我只能使用python 2.6.6,因为它是maya 2013 python

编辑:

Thx @ silas-ray @chepner @theodox我更多地看了Dicts,这正是我需要的东西 我在其上使用了@chepner方法的修改版本。

object_dict = dict( (y, CharInStageList(x,y)) for x,y in data )

像魅力一样工作

我的测试代码看起来像这样

import maya.cmds as cmds
dicttest = {}

def getdata ():  
    global dicttest   
    data = ((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy'))
    dicttest = dict( (y,(x,y)) for x,y in data )

getdata()

def printtest() :
    for char in dicttest:
        print dicttest[char]

printtest()
dicttest.clear()

我本来希望用代码示例评论您的答案,但我无法在那里工作。

3 个答案:

答案 0 :(得分:2)

对象不会添加到类中。相反,您可以使用列表解析并利用*args语法创建一个对象列表,这些对象都是同一个类的所有实例:

data = ((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy'))
object_list = [ CharInStageList(*x) for x in data ]

也许你想要一本字典:

object_dict = dict( (y, CharInStageList(x,y)) for x,y in data )

(请注意,CharInStageList是一个糟糕的类名,因为它不是一个列表;它封装了一个字符。)

如果你真的希望CharInStateList成为一个字符集合,请尝试这样的事情,这只是一个字典的薄包装:

# Your former CharInStageList
class Character(object):
    def __init__(self, charid, charname) :
        self.charid = charid
        self.charname = char name

class OnStageCharacters(object):
    def __init__(self):
        self.characters = dict()

    # Index on-stage characters using their charid
    def add(self, character):
        self.characters[character.charid] = character

on_stage = OnStageCharacters()
for id, name in data:
    on_stage.add( Character(id, name) )

答案 1 :(得分:0)

你不能(至少不是没有攻击locals / globals,这通常不是一个好主意)改变你动态分配的名称。但是,您可以将它们插入到字典中,其中键是动态生成的名称。

characters = {}
for char_data in char_list:
    characters[char_data[1]] = CharInStageList(*char_data)

虽然如果你的所有角色对象都存储了name和id,那么简化整个事物并创建映射字典而不是对象可能更有意义。

character_names_by_id = dict(char_data)
character_ids_by_name = dict((name, id) for id, name in char_data)

答案 2 :(得分:0)

如果您可以使用* args表单填写您的班级实例,那么@ chepner的答案很棒。

如果您只想从循环中提出最有效的方法,请记住您可以一起迭代元组的各个部分:

data = ((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy'))
class_data = (CharInStageList(id, name) for id, name in data)  # "for id, name" will yield two vals

您还可以使用map,这在进行批量数据转换时非常常见。一个常见的方法是使用lambda,这样你就可以清楚地写出来了:

to_char = lambda k: CharInStageList(k[0], k[1])
class_data = map(to_char, data)

如果你做的事情和你的例子一样简单,你可能不想打扰你自己的班级。 namedtuple是一个很好的数据结构,用于创建易于使用的元组。这也意味着你可以互换地使用位置或命名args,就像在@chepner的* args版本中一样:

StageListChar  = namedtuple('CharInStageList', ['id', 'name'])
class_data = map(StageListChar , data)