#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. проблема решена спасибо всем за вклад.