2013-11-20 1 views
2

У меня есть класс, который выглядит так.Как добавить объекты в класс с циклом в Python?

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

в этот класс я бы хотел добавить списки, которые у меня есть.

я знаю, как сделать это Normall путь

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

то будет не проблема, что я на самом деле нужно сделать, это добавить их с помощью петли.

я получаю мои данные в этой форме

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

или

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

количество charachters я имею в сцене всегда находится другая. то, что я представлял бы цикл, как этот

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

что-то вроде этого

Я хочу ObjName изменить сам по себе для каждого объекта я добавить к классу.

Как я могу получить этот эффект. я могу использовать только питон 2.6.6 для этого, так как это майя 2013 питон

Edit:

Thx @ шилы лучей @chepner @theodox я посмотрел в Dicts немного больше, и это в значительной степени то, что мне нужно
Я использую модифицированную версию метода @chepner.

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

работает как шарм

Мой testcode выглядит как этот

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

я хотел бы, чтобы комментировать ваши ответы с кодом exsamples, но я не могу получить, чтобы работать там.

ответ

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)) 
+0

Это немного неловко, но я пытаюсь прокомментировать какой-то код, например, 30 раз, и я уверен, что я правильно сделал пробел, так как он работает с вопросом. но это не получится правильно. – masamoto

+0

Код сложный в комментариях. Вы можете отредактировать свой вопрос, чтобы уточнить, что вы хотите. Однако я предполагаю, что вы хотите, чтобы «CharInStateList» выступал в качестве контейнера. Я попробую обновить свой ответ с тем, что, я думаю, вы пытаетесь спросить. – chepner

0

Вы не можете (по крайней мере, не взломать в /globals, что обычно не рекомендуется), измените имя, которое вы назначаете так динамически. Однако вы можете вставить их в словарь, где ключи - это ваши динамически сгенерированные имена.

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

Хотя, если все ваши объекты характера заготавливают это имя и идентификатор, это могло бы иметь больше смысла, чтобы упростить все это и просто создавать картографические словари, а не объекты.

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

Я довольно новичок в Python. Являются ли dicts Global? Единственная причина, по которой я пытался использовать классы, - это то, что они глобальны и сохраняют правильное значение. Я буду экспериментировать с dicts, чтобы узнать, могут ли они делать то, что мне нужно. спасибо за ответ :) – masamoto

+0

Ни дикты, ни классы (или экземпляры классов в этом отношении) по сути являются глобальными. Если вам нужно сохранить ссылку на экземпляр, как только вы покинете область, в которой они были созданы, вы должны упаковать их в объект или модуль, а затем передать этот объект. –

0

@ ответ 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, что очень общий для выполнения массовых переводов данных. Обычный способ сделать это с лямбда, так что вы можете написать это ясно:

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

Если вы делаете что-то же просто, как ваш пример, вы можете не хотите возиться с вашим собственным классом. namedtuple - отличная структура данных для создания кортежей, с которыми легко работать. Это также означает, что вы можете использовать позиционные или названные args взаимозаменяемо, как в версии @ chepner's * args:

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

Это уже много нового XD. начинает немного головокружение. то, что мне нужно, - это просто способ передачи списка атрибутов, подобных тому, который генерируется одним def для другого def, который будет использоваться дальше. и список выглядит так. , но спасибо за все замечательные способы сделать это :) Я загляну в него. пытаясь узнать как можно больше о будущих проектах. – masamoto

Смежные вопросы