2014-02-17 4 views
1

필자는 Python에서 2.7을 사용하는 것이 비교적 새로워졌습니다. 이것은 작동해야하는 것처럼 보이지만 그렇게하지 않는 것입니다.목록에서 클래스 집합 인스턴스화하기

Player 클래스의 여러 인스턴스로 Game 클래스의 인스턴스를 만들고 싶습니다. 사용자는 많은 수의 플레이어를 지정하여 Game을 인스턴스화합니다 (예 : game = Game (3)).

: 나는 이름

3 명 선수
def getPlayerList(self): 
    self.playerlist = [] 
    for p in range (self.numplayers): 
     self.playerlist.append("p" + str(p+1)) 
    return self.playerlist 

의 목록을 만들고 내가하는 방법으로 시작 플레이어 인스턴스 P1, P2 등

을 호출 할이 3 문자열 목록을 생성

self.playerlist = [p1, p2, p3] 

이제 p1, p2 및 p3에 지정된 Player 인스턴스를 3 개 만들고 싶습니다. 이 할 수있는 가장 쉬운 방법이 될 듯 :

def initPlayers(self): 
    self.getPlayerList() 
    for i in self.playerlist: 
     i = Player(i) # doesn't work 
    return 

이 코드가하는 플레이어 인스턴스 3 번을 통해 루프하지만, "나는"문자열 P1, P2 및 P3로 대체되지 않습니다. 따라서 예를 들어

p1.name 

은 정의되지 않았습니다. 내가 루프이 다른 코드를 테스트하는 경우 그 문제에 대한

는, 그래서 기대 대체 작동,

i.name 

입니다. 예를 들어 :

for i in self.playerlist: 
    print i 

p1 
p2 
p3 

그러나

i = Player(i) 

는이 일을하지 않는 이유

p1 = Player("p1") 

내가 알아낼 수 없습니다 인스턴스로 설정하지 않고, 방법을 모른다 그렇지 않으면 내가이 일을해야 해. 고마워.

답변

3

나는 이것을 과도하게 복잡하게 생각합니다. 동적으로 변수 이름을 생성하는 것은 대개 잘못된 생각입니다. 대신 사전을 사용합니다 : 더 간단

players = {i:Player(i) for i in self.playerlist} 

또는, 당신은 인덱스 플레이어에 액세스 할 수있는 목록을 :

players = [Player(i) for i in self.playerlist] 

당신이 당신의 전류 루프에서하고있는 모든이에 새 Player 객체를 할당한다 루프 변수 ifor은 루프가 반복 될 때 즉시 무시됩니다.

+0

정확합니다. 이 경우 목록도 충분하다.'p = [x in (i) in i xrange (n)] '. 그런 다음'p [0]','p [1]'등과 같이 사용하십시오. – Sahand

+0

이미 목록 버전이 있습니다. 단순히 'xrange'를 사용하면 정확한 플레이어 이름이 부여되지 않습니다. – jonrsharpe

1

같은 방식으로 인쇄되는 다른 종류의 개체 사이의 차이점을 숨길 수 있기 때문에 인쇄가 다소 까다 롭습니다.

self.playerlist의 내용은 p1, p2p3하지만 "p1", "p2""p3" 없습니다. 즉, 목록에 세 개의 문자열이 포함되어 있습니다.

당신은 정말 변수 i에 새로운 p1 변수하거나 할당 할 새 값 2 2를 할당

i = "p1" 
i = 2 

을 기대?

런타임에 "새로운 변수"를 생성하는 것은 파이썬에서 가능합니다 (예를 들어 globals()[i]=2 사용).하지만 거의 필요하지 않습니다. 다만 사전이나 사용하는 대신 변수 목록을 사용하면 훨씬 더 나은 옵션입니다 : 당신이 self.players[0].draw() 사용하는 대신 p1.draw()의 예를 들면 다음

self.players = [Player(i) for i in range(3)] 

당신은 당신이 또한 간단하게 액세스 할 수 self.players[i].draw() 말할 수있는 매우 중요한 이점을 얻을 일반 i 번째 플레이어.

관련 문제