def __init__(self, name, item_manager=None, speed=None, hp=None, defense=None, atk=None):
        self.NAME = name
        self.item_manager = item_manager if item_manager is not None else ItemManager()
        self._SPEED = int(speed) if speed is not None else generate_attribute(self._AVERAGE_SPEED, self._SPEED_SPREAD)
        self.HP = int(hp) if hp is not None else generate_attribute(self._AVERAGE_HP, self._HP_SPREAD)
        self._DEF = int(defense) if defense is not None else generate_attribute(self._AVERAGE_DEF, self._DEF_SPREAD)
        self._ATK = int(atk) if atk is not None else generate_attribute(self._AVERAGE_ATK, self._ATK_SPREAD)
        self._LOG_ATTRIBUTES = [self.get_formatted_name, self.get_formatted_attack, self.get_formatted_defense,
                                self.get_formatted_hp, self.get_formatted_items]

        self._SPOOK_ROUNDS_AHEAD = 0
        self._SPOOK_PENALTY = 0
    def __init__(self, attack=None, defense=None, speed=None, spook_rate=None, spook_power=None):
        if spook_power is not None and spook_power < 0:
            raise ValueError("spook_power must be greater than zero. Specified value was " + spook_power)
        self.ATTACK_BOOST = attack if attack is not None else generate_attribute(self._AVERAGE_ATK_BOOST,
                                                                                 self._ATK_SPREAD)
        self.DEFENSE_BOOST = defense if defense is not None else generate_attribute(self._AVERAGE_DEF_BOOST,
                                                                                    self._DEF_SPREAD)
        self.SPEED_BOOST = speed if speed is not None else generate_attribute(self._AVERAGE_SPEED_BOOST,
                                                                              self._SPEED_SPREAD)
        self.SPOOK_RATE = spook_rate if spook_rate is not None else generate_attribute(self._AVERAGE_SPOOK_RATE,
                                                                                       self._SPOOK_RATE_SPREAD)
        self.SPOOK_POWER = spook_power if spook_power is not None else generate_attribute(self._AVERAGE_SPOOK_POWER,
                                                                                          self._SPOOK_POWER_SPREAD)

        # Primary value is used by implementations of base item to indicate to item manager how the items are to
        # be prioritized. For example, a sword's primary value is attack and a shield's primary value is defense.
        # Swords will be ranked by their attack points and shields will be ranked by their defiense points.
        self.PRIMARY_VALUE = lambda: raise_(NotImplementedError("PRIMARY_VALUE is not implemented."))