2013-08-08 2 views
1

Я действительно надеюсь, что это не повторение ... если это так, я не могу найти ответ нигде, поэтому прошу прощения.Объявление объекта Python не работает

В любом случае, мой вопрос: я пишу код, где, если для данных, которые я получаю, требуется команда вместо игрока, у меня есть класс (называемый Team), который содержит два SinglePlayers (также класс), а затем несколько других атрибутов, просто строки. Проблема в том, что когда я повторяю свой цикл, читая данные xml и заполняя свою «командную» переменную, кажется, что вся информация для SinglePlayers не сбрасывается. Это проблема, потому что она меняет эту информацию каждый раз, когда я вставляю новую «команду» в список «командных» объектов, которые у меня есть. Код длинный, поэтому я собираюсь опубликовать только то, что имеет значение.

Я работаю только с python в течение нескольких дней. Я работаю в прошлом году в java и C++, поэтому мой мозг имеет в голове те понятия, что работают переменные и структуры. Я знаю, что python отличается, поэтому, если кто-то может прояснить, почему это не работает, это было бы потрясающе. Благодаря!

class SinglePlayer: 
    entry_code = "" 
    first_name = "" 
    last_name = "" 
    nation = "" 
    seed_rank_sgl = "" 
    seed_rank_dbl = "" 
    entry_rank_sgl = "" 
    entry_rank_dbl = "" 

class Team:   
    top_player = SinglePlayer() 
    bottom_player = SinglePlayer() 
    entry_code = "" 
    seed_rank = "" 
    entry_rank = "" 

def DoublesEvent(self, team_nodes): 

    #Create List to store team objects 
    teams_list = [] 

    for k in range(0, team_nodes.length): 
     #Get the current node 
     teams_node = team_nodes.item(k) 
     team_node = team_nodes.item(k).getElementsByTagName("Player") 
     top_player_node = team_node.item(0) 
     bottom_player_node = team_node.item(1) 

     #Make a new team object to fill and add to teams_list 
     team = Team() 
     team.entry_code = teams_node.getAttribute("EntryCode") 

     #Top Player Info 
     team.top_player.first_name = top_player_node.getAttribute("FirstName") 
     team.top_player.last_name = top_player_node.getAttribute("LastName") 
     team.top_player.nation = top_player_node.getAttribute("Nation") 


     #Bottom Player Info 
     team.bottom_player.first_name = bottom_player_node.getAttribute("FirstName") 
     team.bottom_player.last_name = bottom_player_node.getAttribute("LastName") 
     team.bottom_player.nation = bottom_player_node.getAttribute("Nation") 

     eam.seed_rank = self.GetSeedRank(team) 
     team.entry_rank = self.GetEntryRank(team) 

     #Add the team to the list 
     teams_list.append(team) 


    return teams_list 
+0

Созданные вами члены - это все атрибуты класса, такие как статические элементы в C++ или Java. И, в более общем плане, весь этот код запускается как часть определения самого класса, а не для построения каждого экземпляра. – abarnert

ответ

3

Ваш класс содержит ссылку на два SinglePlayer() случаи, а не ваши экземпляров. Используйте метод __init__ для создания новых экземпляров для каждого Team например:

class Team:   
    entry_code = "" 
    seed_rank = "" 
    entry_rank = "" 

    def __init__(self): 
     self.top_player = SinglePlayer() 
     self.bottom_player = SinglePlayer() 

Как это происходит, потому что вы перепривязываете каждые из строки атрибутов экземпляров вы создаете, вы случаться создать экземпляр атрибуты для тех, , Вы бы лучше двигаться в тех __init__, а также и делает их отношения, как атрибуты экземпляра явно:

class Team:   
    def __init__(self): 
     self.entry_code = "" 
     self.seed_rank = "" 
     self.entry_rank = "" 
     self.top_player = SinglePlayer() 
     self.bottom_player = SinglePlayer() 

и сделать то же самое для вашего SinglePlayer класса.

+1

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

+0

Ах! Да! Это имеет большое значение. Вчера в своем интернет-исследовании я понял, что это может быть проблемой, но я не был уверен, как это сделать. Хотя, чтобы сделать последний шаг, я по-прежнему возникают проблемы с тем, что получение инициализируется как хорошо, так что я установил, что еще раз изменив последнюю строку на teams_list.append (copy.deepcopy (команда)) Спасибо! – user2658277

+0

@ user2658277: Если вам нужна глубокая копия, тогда у вас есть больше изменяемых атрибутов, которые используются совместно между классами. –

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