파이썬 인스턴트를 method안에서 변수로 사용하고 싶습니다.

조회수 465회

제 질문에 답변해 주신다면 이 은혜 평생 잊지 않겠습니다. 제 질문은 요약해보자면,

인스턴스를 method안에서 변수로 사용하고싶습니다.

예를 들어,

class Marine:
    def __init__(self):
        self.health = 40
        self.power = 15
    def attack(self, unit):
        unit.health -= self.power
        print("{}가 공격을 받아 피가 {}가 되었습니다. ({}의 공격력 {})".format(unit, unit.health, self, self.power))

marine_1 = Marine()
marine_2 = Marine()
marine_1.attack(marine_2)

의 기대 결과값 =

marine_2가 공격을 받아 피가 25가 되었습니다. (marine_1의 공격력 15)

실제 결과값 =

<__main__.Marine object at 0x7fc5f0085d60>가 공격을 받아 피가 25가 되었습니다. (<__main__.Marine object at 0x7fc640a6f760>의 공격력 15)

marine_2를 attack method안에 변수로 사용하는 방법은 뭐가 있을까요?

-. 아규먼트를 쓰고 싶지 않습니다.

def __init__(self, name):
    self.name = name
(중략)
    print("{}가 공격을 받아 피가 {}가 되었습니다. ({}의 공격력 {})".format(unit.name, unit.health, self.name, self.power))

marine_2 = Marine("marine_2")

이렇게 사용하고 싶지 않고

marine_2 = Marine()에서

marine_2를 사용하고 싶습니다

-. 그러나, method를 추가하는 방법은 선호합니다.

-. dir(marine_2)에 나오는 어트리뷰트들을 모두 print(marine2.main)/ print(str(marine_2.main) 등 넣어보았는데 주소만나올뿐 "marine_2"를 반환하는 결과는 없었습니다. 모든 어트리뷰트 다 해봄(print) 모든 어트리뷰트 다 해봄(print(str)) 혹시 Package를 사용하지 않는 방법으로 저 인스턴스를 변수로 사용하는 방법은 없을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 소스에서의 변수명은 그냥 기호일 뿐입니다. 그 변수명은 소스를 작성하는 프로그래머에게만 의미있는 기호여야하지, 그 이름을 실제 데이터로 사용하는 것은 이상해요.

    왜 이렇게 사용하고 싶지 않은지 모르겠는데, marine_2 = Marine("marine_2") 와 같이 명시적으로 이름을 지정하여 사용하는 것이 올바른 방법이라고 생각됩니다.

    동적 인터프리터 언어의 특성상 변수명을 알아내는 방법이 있겠지만, 그건 너무 부자연스러운 방법입니다.

  • 아래 코드 참고하세요.

    • 코드
    class Marine:
        marine_id = 0
        def __init__(self):
            Marine.marine_id += 1
            self.health = 40
            self.power = 15
            self.name = 'marine_' + str(Marine.marine_id)
        def attack(self, unit):
            unit.health -= self.power
            print("{}가 공격을 받아 피가 {}가 되었습니다. ({}의 공격력 {})".format(unit.name, unit.health, self.name, self.power))
    
    marine_1 = Marine()
    marine_2 = Marine()
    marine_3 = Marine()
    marine_1.attack(marine_2)
    marine_3.attack(marine_2)
    
    • 결과

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)