Note self
self는 객체인 자기 자신을 의미합니다. 생성자 또는 메서드에서 self를 전달값에 넣는다는 것은 결국 객체를 받는다는 뜻입니다. 그래서 메서드 안에서 self.을 사용하는 것은 객체의 인스턴스 변수 또는 메서드에 접근하겠다는 의미가 됩니다.
flamethrower1은 AttackUnit 클래스의 인스턴스입니다. flamethrower1 객체를 생성할 때는 name, hp, damage 정보만 전달하지만, 자동으로 호출되는 __init__() 생성자의 첫 번째 전달값에 있는 self에 flamethrower1 객체도 전달한다고 보면 됩니다. 그래서 생성자 안에 작성한 self.name = name은 flamethrower1.name = name과 같은 의미입니다.
복잡하고 이해하기 어렵다면 2가지만 기억하세요. 첫째, 클래스의 메서드에는 첫 번째 전달값으로 self를 적어야 합니다. 둘째, 클래스 안에서는 변수 또는 메서드에 접근하려면 self.name 또는 self.attack(...)처럼 인스턴스 변수 또는 메서드명 앞에 self.을 함께 적어야 합니다.