Как ссылаться на атрибут из одного класса, используя другой класс

#python-3.x #class #instantiation

#python-3.x #класс #создание экземпляра

Вопрос:

Вот мой код

 import random

class Player_Character:
    def __init__(self, hp, maxhp, ac, THAC0):
        self.hp = int(hp)
        self.maxhp = int(maxhp)
        self.ac = int(ac)
        self.THAC0 = int(THAC0)
    def attack(goblin):
        Player_Character_Damage = random.randint(1,10)
        goblin.hp -= Player_Character_Damage
        if (goblin.hp <= 0):
            print("congratulations you killed the goblin")
            del goblin

class goblin:
    def __init__(self, hp, maxhp, ac, THAC0):
        self.hp = int(hp)
        self.maxhp = int(maxhp)
        self.ac = int(ac)
        self.THAC0 = int(THAC0)
    def attack(Player_Character):
        goblin_damage = random.randint(1,4)
        Player_Character.hp -= goblin_damage
        if (Player_Character.hp <= 0):
            print("oh dear you have died")
            del Player_Character


Player_Character(10, 20, 10, 15)
goblin(5, 10, 8, 18)

Player_Character.attack(goblin)
 

Я ожидаю, что Player_Character.attack(goblin) нанесет 1-10 урона гоблину (вероятно, убьет его), но вместо этого я получаю сообщение об ошибке: AttributeError: type object 'goblin' has no attribute 'hp' … очевидно, что я создал класс с атрибутом «hp» и теперь в замешательстве.

Ответ №1:

Вы должны создавать экземпляры объектов

как объяснил @ShadowRanger в комментариях, я должен был упомянуть, что я добавил self в функции

 import random

class Player_Character:
    def __init__(self, hp, maxhp, ac, THAC0):
        self.hp = int(hp)
        self.maxhp = int(maxhp)
        self.ac = int(ac)
        self.THAC0 = int(THAC0)
    def attack(self, goblin):
        Player_Character_Damage = random.randint(1,10)
        goblin.hp -= Player_Character_Damage
        if (goblin.hp <= 0):
            print("congratulations you killed the goblin")
            del goblin

class goblin:
    def __init__(self, hp, maxhp, ac, THAC0):
        self.hp = int(hp)
        self.maxhp = int(maxhp)
        self.ac = int(ac)
        self.THAC0 = int(THAC0)
    def attack(self, Player_Character):
        goblin_damage = random.randint(1,4)
        Player_Character.hp -= goblin_damage
        if (Player_Character.hp <= 0):
            print("oh dear you have died")
            del Player_Character


p = Player_Character(10, 20, 10, 15)
g = goblin(5, 10, 8, 18)


p.attack(g)

 

также @ShadowRanger упомянул, что del работает не так, как предполагалось, вы можете использовать его снаружи для удаления экземпляров.

 p = Player_Character(10, 20, 10, 15)
g = goblin(5, 10, 8, 18)

p.attack(g)

if(g.hp <= 0):
    print("congratulations you killed the goblin")
    del g
 

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

1. Когда я это делаю, он возвращает следующее: Traceback (последний последний вызов): File «C:UsersHezekiahPycharmProjectsOOPCode это Вы Сами RPG.py «, строка 34, в <module> p.attack(g) Ошибка типа: attack() принимает 1 позиционный аргумент, но было задано 2

2. @HezekiahBodine: Вы не заметили (не ваша вина, @can не упомянул об этом), что они добавили self параметр к каждому из ваших методов экземпляра; вам нужен этот self параметр для этого (и всех методов экземпляра) для работы. В данном конкретном случае вы на самом деле не используете self (по-видимому, все гоблины наносят урон одинаково во всех случаях), поэтому вы можете удалить self и украсить @staticmethod , и это сработает, но если вы хотите использовать, скажем, их THAC0 , чтобы определить, попали ли они, вам нужно self.THAC0 будет получить к нему доступ.

3. Примечание: с правильными экземплярами я должен отметить, что del это не делает того, что, по мнению OP, он делает. Как написано, это совершенно бессмысленно (это неявно del редактируется, когда метод возвращается сразу после этой строки), поскольку отмена привязки локальной ссылки не влияет на p функцию или g вне ее.

4. проблема решена спасибо всем за вклад.