2023-03-27 TIL

0v0baek·2023년 3월 27일
0

TIL

목록 보기
14/92

[Python] class에서 return한 변수값이 제대로 할당되지 않는 문제

문제 코드

class Player:
	###
    중략
    ###
    def attack(self):
        print("일반 공격 돌입!!")
        attack = random.randint(self.power-10, self.power+10)
        print(f"당신은 {attack}의 피해를 입혔다!")
        return attack

class Monster():
	###
    중략
    ###
    def damage(self, attack):
        self.hp = self.hp - attack
        print(f"당신은 {attack}만큼의 피해를 입었습니다!")

p.attack()
m.damage(attack)

>>> NameError: name 'attack' is not defined

분명 attack을 return했는데... 값이 없다고 한다
뭐가 문제지?

해결 방안

return 된 값을 class 바깥의 변수에 담아주지 않아서 값을 찾을 수 없었던 것!!

해결 코드 방법들

1. 변수 값을 할당시켜주기

class Player:
	###
    중략
    ###
    def attack(self):
        print("일반 공격 돌입!!")
        attack = random.randint(self.power-10, self.power+10)
        print(f"당신은 {attack}의 피해를 입혔다!")
        return attack

class Monster():
	###
    중략
    ###
    def damage(self, attack):
        self.hp = self.hp - attack
        print(f"당신은 {attack}만큼의 피해를 입었습니다!")

# class 바깥에서 변수 값을 할당
p_attack = p.attack()
m.damage(p_attack)

2. 함수 불러올 때 값 안에 아예 p.attack()을 넣어버리기

class Player:
	###
    중략
    ###
    def attack(self):
        print("일반 공격 돌입!!")
        attack = random.randint(self.power-10, self.power+10)
        print(f"당신은 {attack}의 피해를 입혔다!")
        return attack

class Monster():
	###
    중략
    ###
    def damage(self, attack):
        self.hp = self.hp - attack
        print(f"당신은 {attack}만큼의 피해를 입었습니다!")

# class 바깥에서 변수 값을 할당
m.damage(p.attack())

코드를 깔끔하게 쓰는 건 아랫쪽이 낫긴 하지만
나의 경우 time.sleep를 통해 결과값을 천천히 도출시키고 싶었기 때문에 1번을 채택했다.

코드를 깔끔하게 쓰는 것도 중요하지만, 활용 방식에 따라서 차선을 선택하는 게 나을때도 있다는 걸 느꼈다.

[Python] class 인스턴스를 random으로 뽑아내기

class 인스턴스를 random으로 뽑아내고 싶을 떄
-> list 사용

# 인스턴스 랜덤으로 뽑기
class Monster():
    def __init__(self, type, hp, power):
        self.type = type
        self.hp = hp
        self.hp_max = hp
        self.power = power
        ###
        중략
        ###
        
monster_list = [
    Monster(type="용용이", hp=100, power=20),
    Monster(type="칼칼이", hp=200, power=25),
    Monster(type="빵빵이", hp=300, power=30),
    Monster(type="쌩쌩이", hp=400, power=35),
    Monster(type="펑펑이", hp=500, power=40)
]
m = random.choice(monster_list)

이렇게 list에 랜덤한 인스턴스 후보들을 넣어주고,
random.choice를 사용, 할당하면 랜덤으로 하나가 뽑힌다!

리스트랑 딕셔너리를 잘만 활용하면 코드를 정말 깔끔하게 만들 수 있구나 싶다.
특히 random 같은 함수랑 같이 붙으면 가독성이 더 좋아지는듯.

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!

0개의 댓글