2013-05-15 2 views
2

저는 파이썬과 프로그래밍에 새로운 것이 일반적입니다.Python : 변수를 기반으로하는 인스턴스 이름

저는 연습 프로젝트로서 터미널 기반 게임을 만들고 있습니다. 게임은 일련의 방과 괴물이 될 것입니다. 내 계획은이 수업의 괴물과 방을 만드는 것이 었습니다. 나는 게임 전체에 걸쳐 이들 중 몇 가지를 만들고 있으며, 플레이어 액션을 기반으로 즉석에서 만들어진 많은 게임이 있습니다.

새로운 괴물과 방을 만들어, 나는 현재 사전에 자신의 이름을 알고에 붙어 있어요. like :

class Monster(object): 
    pass 

Monster1 = Monster(something) 

런타임 이전 인스턴스 이름을 알고 있으면 서투른 해결책처럼 보입니다. 변수를 가지고 괴물의 수를 추적하고 인스턴스 이름을 동적으로 생성하는 것이 더 쉬울 것이라고 생각했습니다. automaticallt 것이다 만든 첫 번째 몬스터 인스턴스가 Monster1을 할 수 있도록, 다음이 될 것 Monster2 등이 같은

뭔가 :

class Monster(object): 
    pass 

monster_id = 0 

def createMonster(monster_id) 
monster_instance = "Monster" + str(monster_id) 
monster_id += 1 
# The following is where i'm stuck. Basically I want to have the instance name be equal to the content of monster_instance 
(monster_instance) = Monster() 

그래서 질문은 : 어떻게 모르고 클래스의 인스턴스를 만들 수 있습니다 인스턴스 이전 런타임의 이름?

나는이 작업을 받고 힘든 시간을 보내고있어 만약 내가 멍청한 짓을하고 있어요 때문에 나는 또한 궁금하네요 그리고이 일을 훨씬 똑똑/우아한 방법입니다. 모든 상황에서 모든 도움과 의견은 높이 평가됩니다. 그래서 질문

답변

7

이것은 초보자에게 자주 묻는 질문입니다. 그렇습니다. "훨씬 더 똑똑하고 우아한 방법"이 있습니다. 당신은 당신의 인스턴스 잡고 사전과 같은 데이터 구조를 사용

monsters = {} 
monsters['Monster1'] = Monster() 
monsters['Monster2'] = Monster() 

사전에 키가 문자열이므로를 런타임에 그 정의 아무 문제가 없습니다 그러나 당신은 좋아한다 :

monster_name = "Monster" + str(monster_id) 
monster_id += 1 
monsters[monster_name] = Monster() 
+0

의견에 감사드립니다. 이것은 내가 찾고 있었던 바로 그 것이었다! 감사합니다 :-) – Splurk

0

은 다음과 같습니다 어떻게 인스턴스 사전 런타임의 이름을 알고 하지 않고 클래스의 인스턴스를 만들 수 있습니까?

그렇지 않습니다. 너는 혼란 스럽다.

는 당신은 런타임에 인스턴스를 생성

, 당신은 당신의 프로그램이 변수 이름과 상호 작용하지 않기 때문에, 그 변수 이름에있는 개체에 대한 정보를 인코딩하고 싶지 않아요.

당신은 당신의 객체를 추적하는 데이터 구조체를 사용합니다. 고유 한 ID가 필요한 경우 가장 좋은 해결책은 객체 생성시 UUID를 할당하는 것입니다.

+0

그것은 파이썬 dinamic 클래스를 생성 할 수있다 [메타 클래스를 사용하여 (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python) –

+0

@SaulloCastro (a) 메타 클래스를 사용하지 않고 동적 클래스를 생성 할 수 있습니다. (b) 질문이나 대답 모두 동적 클래스를 설명하지 않으므로 주석의 요점을 이해하지 못합니다. – Marcin

+0

나는 동적 클래스로 문제를 해결할 수 있다고 생각했다. 내가 당신의 대답을 읽었을 때 나는 인스턴스 사전 런타임의 이름을 모른 채로 클래스의 인스턴스를 생성 할 수 없다는 점에 동의하지 않는다. 그러나 지금 나는 당신의 요점을 알고 있다고 믿습니다 ... 인스턴스의 이름은 미리 알려 져야합니다. "클래스의 이름"을 이해했습니다. ... –

5

난 당신이 어떻게해야 하는지를 정말로하고 싶지 않은지 확실히 확신합니다.

동적 이름을 만드는 대신 (나중에 사용할 수없는 경우 이름을 알 수 없기 때문에) 개체를 보관하기 위해 데이터 구조를 사용해야합니다.당신의 monster1 변수가 monsters[1]가 될 수 있도록 예를 들어, list 쉽게 정수에 의해 색인을 생성 할 수 있습니다 :

# create the list of monsters 
monsters = [Monster(1), Monster(2), Monster(3)] # or whatever parameters 

# then later, use it 
monster[1].eat_player() 

또는 오히려 시간 앞서 전체 목록을 설정하고 명시 적으로 인덱스를 사용하는 것보다를, 당신은 목록을 동적으로 만들 수 있습니다 그리고 반복 :

# setup 
monsters = [] # empty list 

# later, dynamically add monsters 
monster_spawn_timer -= 1 
if monster_spawn_timer < 0: 
    monster_spawn_timer += MONSTER_SPAWN_INTERVAL 
    monsters.append(Monster()) 

# and at some other point in your main loop, you can iterate over the monsters: 
for m in monsters: 
    m.do_stuff() 
+0

귀하의 의견에 감사드립니다! Richie의 솔루션을 사용하여 끝났지 만,이 접근 방식의 이점을 분명히 볼 수 있습니다. 나는이 중 일부를 사용하는 것으로 끝날 가능성이 높습니다. 고맙습니다! – Splurk

1

을 당신은 세 가지 옵션이 있습니다

  1. 사용를: eval(monster_instance + ' = Monster()'). eval은 기본적으로 문자열을 실행합니다. RichieHindle이 언급 한 바와 같이 eval은 이상적인 솔루션이 아닙니다. 옵션 일 수도 있지만 추천 된 것은 아닙니다.

  2. 배열/목록 : monsters.append(Monster())을 사용하십시오. monsters = []을 사용하여 초기화하십시오.

  3. 사전을 사용하십시오 : monsters[monster_instance: Monster()] 또는 monsters.update({monster_instance: Monster()}). monsters = dict()을 사용하여 초기화하십시오.

+3

초보자가'eval' 또는'exec'을 사용하도록 권장하지 마십시오. 거의 정답은 아닙니다. – RichieHindle

+0

@ 리치 하인드 : 조언 해 주셔서 감사합니다. 나는 그 지위를 편집했다. – refi64

+1

처음에 이것을 조사했을 때 나는 실제로 eval을 발견했지만, 다행스럽게도 대부분의 게시물은 내가 지금 그걸 멀리해야한다고 말했다. 하지만 입력 주셔서 감사합니다 :-) – Splurk

관련 문제