Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中通过循环向类添加对象?_Python_Maya - Fatal编程技术网

如何在Python中通过循环向类添加对象?

如何在Python中通过循环向类添加对象?,python,maya,Python,Maya,我有一节课看起来像这样 class CharInStageList(object): def __init__(self, charid, charname) : self.charid = charid self.charname = charname 在这个类中,我想添加我拥有的列表 我知道怎么用正常的方式做 charOne = CharInStageList(1,'Tim') charTwo = CharInStageList(2,'Struppi

我有一节课看起来像这样

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'))

我在场景中的角色数量总是不同的。 我想象的是这样一个循环

charlist = ((1,'Tim'),(4,'Struppi'))
for char in charlist
    objname = CharInStageList(char[0],char[1])
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()
像这样的

charlist = ((1,'Tim'),(4,'Struppi'))
for char in charlist
    objname = CharInStageList(char[0],char[1])
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()
对于我添加到类中的每个对象,我希望对象名能够自行更改

我怎样才能得到这种效果? 我只能使用Python2.6.6,因为它是maya 2013 python

编辑:

Thx@silas ray@chepner@theodox我对Dicts进行了更多的研究,这正是我所需要的
我在上面使用了@chepner方法的修改版本

object_dict = dict( (y, CharInStageList(x,y)) for x,y in data )
很有魅力

我的测试代码如下所示

charlist = ((1,'Tim'),(4,'Struppi'))
for char in charlist
    objname = CharInStageList(char[0],char[1])
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()
我很想在你的答案中用代码示例进行注释,但我无法在那里使用。

你不能(至少不能不在
本地人
/
全球人
上进行黑客攻击,这通常不是一个好主意)像那样动态地更改你分配的名称。但是,您可以将它们插入到字典中,其中的键是动态生成的名称

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)

对象不会添加到类中。相反,您可以使用列表理解并利用
*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
对于类来说不是一个好名字,因为它不是一个列表;它封装了一个字符。)

如果您真的想让charinstatist成为字符的集合,请尝试以下方法,这只是字典的一个薄包装:

# 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) )

@如果您可以使用*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
您还可以使用,这在进行批量数据转换时非常常见。一种常见的方法是使用lambda,以便您可以清楚地书写:

to_char = lambda k: CharInStageList(k[0], k[1])
class_data = map(to_char, data)
如果您正在做一些像示例一样简单的事情,您可能不想为自己的类而烦恼。是一个很好的数据结构,用于创建易于使用的元组。这还意味着您可以互换使用位置参数或命名参数,就像在@chepner的*args版本中一样:

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

我对Python很陌生。dicts是全球性的吗?我尝试使用类的唯一原因是它们是全局的,并且保持正确的值。我将尝试一下dicts,看看它们是否能满足我的需要。谢谢你的回答:)dicts和class(或类实例)都不是天生的全局性的。如果你离开创建实例的范围后需要维护对实例的引用,你应该将它们打包到一个对象或模块中,然后传递该对象。这有点尴尬,但我现在尝试用一些代码注释30次,我很确定我做了正确的空格,因为它可以解决问题。但它不会正确地出现。注释中的代码很复杂。你可以编辑你的问题来澄清你想要什么。不过,我猜您希望
charinstatist
充当容器。我会尝试用我认为你可能会问的问题更新我的答案。现在这已经开始变得很多了XD。开始有点头晕。我需要的只是一种方法,将一个def生成的字符列表传输到另一个def,以便进一步使用。清单是这样的。但是谢谢你所有的好方法:)我会调查的。为将来的项目尽可能多地学习。