如何在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,以便进一步使用。清单是这样的。但是谢谢你所有的好方法:)我会调查的。为将来的项目尽可能多地学习。