Как я мог бы использовать несколько классов вместе без наследования?

#python #class

#python #класс

Вопрос:

В настоящее время я изучаю классы и применяю их по ходу дела, но я столкнулся с проблемой, которую я не уверен, как обойти:

Я не знаю, как мне определить персонажа, имеющего оружие.

Я изучал проблему в другом месте, но это всегда приводит к наследованию, которого я хочу избежать, поскольку это не имеет смысла. Есть ли какой-нибудь способ сделать это? Я покажу как соответствующий код проблемы, так и ниже, полный код для используемых классов.

Соответствующий код

Класс оружия

 class weapon:

    def __init__ (self):
        <constructor>

    def set_attack (self, attack):
        self.attack = attack

    def get_attack (self):
        return self.attack

  

Символьный класс

 class character:

    def __init__ (self):
        <constructor>

    def set_attack (self, amount):
        self.attack = amount

    def get_attack (self):
        return self.attack
  

Полный код

Класс оружия

 class weapon:

    def __init__ (self, name, attack, crit_chance, crit_bonus, rarity, type_bonus):
        self.name = name
        self.attack = attack
        self.crit_chance = crit_chance
        self.crit_bonus = crit_bonus
        self.rarity = rarity
        self.type_bonus = type_bonus

    def set_name (self, name):
        self.name = name

    def set_attack (self, attack):
        self.attack = attack

    def set_crit_chance (self, crit_chance):
        self.crit_chance = crit_chance

    def set_crit_bonus (self, crit_bonus):
        self.crit_bonus = crit_bonus

    def set_rarity (self, rarity):
        self.rarity = rarity

    def set_type_bonus (self, type_bonus):
        self.type_bonus = type_bonus

    def get_name (self):
        return self.name

    def get_attack (self):
        return self.attack

    def get_crit_chance (self):
        return self.crit_chance

    def get_crit_bonus (self):
        return self.crit_bonus

    def get_rarity (self):
        return self.rarity

    def get_type_bonus (self):
        return self.type_bonus
  

Символьный класс

 class character:

    def __init__ (self, name, max_health, current_health, attack):
        self.name = name
        self.max_health = max_health
        self.current_health = current_health
        self.attack = attack

    def set_name (self, name):
        self.name = name

    def set_max_health (self, amount):
        self.max_amount = amount

    def set_current_health (self, amount):
        self.current_health = amount

    def set_attack (self, amount):
        self.attack = amount

    def get_name (self):
        return self.name

    def get_max_health (self):
        return self.max_health

    def get_current_health (self):
        return self.current_health

    def get_attack (self):
        return self.attack
  

Класс Player, наследующий от класса Character

 class player (character):

    def __init__ (self, name, max_health, current_health, attack, money, level, xp):
        super().__init__(name, max_health, current_health, attack)
        self.money = money
        self.level = level
        self.xp = xp

    def set_money (self, amount):
        self.money = amount

    def set_level (self, amount):
        self.level = amount

    def set_xp (self, amount):
        self.xp = amount

    def get_money (self):
        return self.money

    def get_level (self):
        return self.level

    def get_xp (self):
        return self.xp
  

Я ожидаю, что игрок, который наследует от персонажа, сможет атаковать, используя значение объекта оружия, привязанного к этому персонажу.
Приветствуется любая информация. выделенный текст

Комментарии:

1. Добавьте weapon член в свой player класс.

2. К weapon вашему player классу не привязан. Вам нужно инициализировать один из них в вашем player конструкторе и использовать его get_attack метод для получения значения атаки.

3. Вы могли бы удалить атаку из персонажа и присвоить персонажу свойство оружия. Тогда вы бы обратились к someplayer.weapon.attack

4. Вам действительно не нужны все эти методы получения и установки.

5. Вы можете охватить оба сценария: атаку игрока или атаку игрока на кого-то. Проверьте мой ответ и посмотрите, имеет ли он смысл!

Ответ №1:

Для начала вы можете избавиться от всех этих геттеров и сеттеров и сделать свои классы как

 class Weapon:

    def __init__ (self, name, attack, crit_chance, crit_bonus, rarity, type_bonus):
        self.name = name
        self.attack = attack
        self.crit_chance = crit_chance
        self.crit_bonus = crit_bonus
        self.rarity = rarity
        self.type_bonus = type_bonus

class Character:

    def __init__ (self, name, max_health, current_health, attack):
        self.name = name
        self.max_health = max_health
        self.current_health = current_health
        self.attack = attack
  

Затем передайте объект оружия вашему классу player и используйте его для атаки на игрока, здесь weapon представлено оружие с игроком

 class Player (character):

    def __init__ (self, name, max_health, current_health, attack, money, level, xp, weapon):
        super().__init__(name, max_health, current_health, attack)
        self.money = money
        self.level = level
        self.xp = xp
        self.weapon = weapon

    #For e.g. A weapon attacks and reduces the current health of the player
    def attack(self):
       self.current_health -= self.weapon.attack
  

Или передать как объект класса оружия, так и объект класса персонажа вашему классу игрока, otherplayer атакован ли игрок и weapon находится ли оружие у игрока

 class Player (character):

    def __init__ (self, name, max_health, current_health, attack, money, level, xp, otherplayer, weapon):
        super().__init__(name, max_health, current_health, attack)
        self.money = money
        self.level = level
        self.xp = xp
        self.otherplayer = otherplayer
        self.weapon = weapon

    def attack(self):

        self.otherplayer.current_health -= self.weapon.attack
  

Комментарии:

1. Отлично, пожалуйста, поддержите / примите мой ответ, если он вам помог 🙂

2. Подойдет! Еще раз спасибо, хорошего дня

3. Спасибо, чувак! Не стесняйтесь спрашивать, если у вас есть дополнительные вопросы!

4. Хорошо, телефон вот-вот умрет, но позже я проверю его и спрошу, нужно ли

5. Я вижу, вы не приняли мой ответ! Чего-то не хватало?

Ответ №2:

Character Класс будет иметь поле, являющееся экземпляром Weapon класса, например:

 class Character:

    def __init__ (self, name, max_health, current_health, attack, weapon):
        self.name = name
        self.max_health = max_health
        self.current_health = current_health
        self.attack = attack
        self.weapon = weapon  # this line

    def set_name(self, name):
        self.name = name

    def set_weapon(self, weapon):
        self.weapon = weapon
  

Вы просто создаете Weapon объект и передаете его Character объекту при его создании (или с помощью метода setter):

 weapon = Weapon()
character = Character('Char Name', 100, 100, 20, weapon)
  

Теперь, в качестве дополнительного примечания, пожалуйста, называйте свои классы, используя прописные буквы для начальной буквы, это соглашение PEP8. Это помогает отличать имена классов от экземпляров, иначе вы не смогли бы вызывать экземпляры weapon и character в моем примере выше.