Форум сайта python.su
Доброго времени суток.
Есть 2 класса с однотипными атрибутами, допустим:
class Weapon(): def __init__(self, health = 0, attack = 0, defense = 0, vampirism = 0, heal_power = 0): self.health = health self.attack = attack self.defense = defense self.vampirism = vampirism self.heal_power = heal_power class Sword(Weapon): def __init__(self): super().__init__(health = 5, attack = 2) class Warrior: maxhealth = 50 name = 'warrior' def __init__(self, health = 50, attack = 5, defense = 0): self.health = health self.attack = attack self.defense = defense self.equipped_list = []
def equip_weapon(self, weapon): if not isinstance(weapon, Weapon()): weapon = Weapon() self.equipped_list.append(weapon) #пока пишем вручную self.health += weapon.health self.attack += weapon.attack self.............
def equip_weapon(self, weapon): if not isinstance(weapon, Weapon): weapon = Weapon() list2 = [a for a in dir(weapon) if not a.startswith('__')] for a in list2: if self.a and self.a != 0: self.a += weapon.a self.equipped_list.append(weapon)
Traceback (most recent call last): File "<pyshell#145>", line 1, in <module> a.equip_weapon(b) File "C:/Users/Леха/Desktop/Battle/another solution test.py", line 32, in equip_weapon if self.a and self.a != 0: AttributeError: 'Warrior' object has no attribute 'a'
Отредактировано Alexey_mne31 (Сен. 24, 2021 14:49:05)
Офлайн
Может, тебе подучиться? А то ты такую ахинею пишешь и даже не понимаешь этого. Как бы тут даже нечего посоветовать. Ты вот там инстанциируешь объект класса Weapon, в то время как этот класс абстрактный и нужен только для наследования от него. Или там ты собрался из одного объекта лезть во внутренности другого объекта, нарушая базовый принцип, про который ты, видимо, даже не в курсе. То есть это вот твои познания в ООП на таком уровне. А познания питона тоже говорят о многом в виде вот этих моментов по исползованию dir() и пробелов в имени модуля питона. Ноль на ноль равно ноль в квадрате.
Офлайн
py.user.nextНу я думал, форум Python для новичков - как раз место для таких вот неучей.
Может, тебе подучиться? А то ты такую ахинею пишешь и даже не понимаешь этого. Как бы тут даже нечего посоветовать. Ты вот там инстанциируешь объект класса Weapon, в то время как этот класс абстрактный и нужен только для наследования от него. Или там ты собрался из одного объекта лезть во внутренности другого объекта, нарушая базовый принцип, про который ты, видимо, даже не в курсе. То есть это вот твои познания в ООП на таком уровне. А познания питона тоже говорят о многом в виде вот этих моментов по исползованию dir() и пробелов в имени модуля питона. Ноль на ноль равно ноль в квадрате.
if not isinstance(weapon, Weapon): weapon = weapon()
for a in list2: if self.a and self.a != 0: self.a += weapon.a
Отредактировано Alexey_mne31 (Сен. 24, 2021 16:51:55)
Офлайн
> оказываешься в дебрях тысяч страниц, а у меня на это нет времени
Куда ты спешишь?
> я перехожу от локальной переменной “а” как атрибуту класса
Что значит “перехожу”? Ты обращаешься к атрибуту который не существует и получаешь ошибку. Всё норм.
> Но само использование self превращает мою локальную переменную в атрибут
Нет, не превращает.
> Вот мне и надо понять, как совместить локальную переменную метода “а” (которая перебирает названия атрибутов и на определенной итерации цикла хранит, допустим “attack”) с названием атрибута класса.
Погугли hasattr, и у тебя нет атрибутов класса.
> как сделать объединение атрибутов 2 классов, отталкиваясь от названия атрибута
А вот этого делать вообще не нужно и что бы это понять нужно нормально учится, а не так как ты.
Офлайн
Rodegast
> оказываешься в дебрях тысяч страниц, а у меня на это нет времениКуда ты спешишь? > я перехожу от локальной переменной “а” как атрибуту классаЧто значит “перехожу”? Ты обращаешься к атрибуту который не существует и получаешь ошибку. Всё норм.> Но само использование self превращает мою локальную переменную в атрибутНет, не превращает.> Вот мне и надо понять, как совместить локальную переменную метода “а” (которая перебирает названия атрибутов и на определенной итерации цикла хранит, допустим “attack”) с названием атрибута класса.Погугли hasattr, и у тебя нет атрибутов класса.> как сделать объединение атрибутов 2 классов, отталкиваясь от названия атрибутаА вот этого делать вообще не нужно и что бы это понять нужно нормально учится, а не так как ты.
def equip_weapon(self, weapon): if not isinstance(weapon, Weapon): weapon = weapon() list1 = [getattr(weapon,a) for a in dir(weapon) if not a.startswith('__')] list2 = [a for a in dir(weapon) if not a.startswith('__')] list3 = dict(zip(list2, list1)) for element in list3: if hasattr(self, element): setattr(self, element, getattr(self, element) + list3[element]) self.equipped_list.append(weapon)
Rodegast
> как сделать объединение атрибутов 2 классов, отталкиваясь от названия атрибута
А вот этого делать вообще не нужно и что бы это понять нужно нормально учится, а не так как ты.
And finally, you should add an equip_weapon(weapon_name) method to all of the soldiers classes. It should equip the chosen soldier with the chosen weapon. This method also should work for the units in the army. You should hold them in the list and use it like this: my_army.units[0].equip_weapon(Sword()) - equip the first soldier with the sword.
Отредактировано Alexey_mne31 (Сен. 24, 2021 18:24:58)
Офлайн
Alexey_mne31может вот так нужно?
Выкусите. УХАХАХАХА!
class Weapon(): def __init__(self, health = 0, attack = 0, defense = 0, vampirism = 0, heal_power = 0): self.health = health self.attack = attack self.defense = defense self.vampirism = vampirism self.heal_power = heal_power class Sword(Weapon): def __init__(self): super().__init__(health = 5, attack = 2) class Warrior: maxhealth = 50 name = 'warrior' def __init__(self, health = 50, attack = 5, defense = 0): self.health = health self.attack = attack self.defense = defense self.equipped_list = [] def equip_weapon(self, weapon:Weapon): self.equipped_list.append(weapon) self.health += weapon.health self.attack += weapon.attack self.defense += weapon.defense # # my_warrior = Warrior() print('было:') print(my_warrior.health, my_warrior.attack, my_warrior.defense) my_warrior.equip_weapon(Sword()) print('стало:') print(my_warrior.health, my_warrior.attack, my_warrior.defense) print(my_warrior.equipped_list)
было: 50 5 0 стало: 55 7 0 [<__main__.Sword object at 0x00000253005DEA48>] Process finished with exit code 0
Отредактировано xam1816 (Сен. 24, 2021 21:35:57)
Офлайн
Alexey_mne31Это задание на полиморфизм поведения.
У меня есть задание:And finally, you should add an equip_weapon(weapon_name) method to all of the soldiers classes. It should equip the chosen soldier with the chosen weapon.
This method also should work for the units in the army. You should hold them in the list and use it like this:
my_army.units[0].equip_weapon(Sword()) - equip the first soldier with the sword.
Alexey_mne31Ну, ты имеешь в виду, что самообучиться ты не можешь и тебе нужен преподаватель, который составит программу обучение и всё такое? А-а-а… у тебя, походу, денег нет ещё на преподавателя. Тогда всё понятно.
И да, мне надо подучиться, но когда лезешь подучиваться, оказываешься в дебрях тысяч страниц
Alexey_mne31Новичков в питоне, в питоне! а не в программировании. Ты-то в программировании полный ноль. А программирование - это не питон, питон - это лишь инструмент для программирования. Это как карандаш. Карандаш - это не рисование, это просто инструмент для рисования. Взяв карандаш, ты не нарисуешь кошку, потому что ты просто не умеешь рисовать кошек вообще ничем. А карандаш тут вообще ни при чём. Ты его как ни бери, кошка от этого не нарисуется сама.
P.S. еще раз извиняюсь за невежество, но это ФОРУМ ДЛЯ НОВИЧКОВ…ДАЖЕ НЕ ЧАЙНИКОВ, НОВИЧКОВ БЛИН…
Отредактировано py.user.next (Сен. 25, 2021 00:32:34)
Офлайн
xam1816
спасибо. хоть один нормальный человек попробовал помочь
Да, так и нужно было.
Просто я попытался перебрать атрибуты циклом и сопоставить автоматически то, что ты сделал вручную ( и у меня, кстати, получилось.)
Спросил у старожилов, КАКОЙ есть общепринятый способ автоматического перебора и сопоставления атрибутов по названию? А они что-то разозлились на мой вопрос….приму к сведению, возможно, нет такого способа
Отредактировано Alexey_mne31 (Сен. 25, 2021 05:30:47)
Офлайн
Alexey_mne31А если условия задачи поменяются на такие
КАКОЙ есть общепринятый способ автоматического перебора и сопоставления атрибутов по названию? А они что-то разозлились на мой вопрос
self.health *= weapon.health self.attack -= weapon.attack self.defense += weapon.defense
Отредактировано xam1816 (Сен. 25, 2021 09:20:14)
Офлайн
xam1816
class Warrior: maxhealth = 50 name = 'warrior' def __init__(self, health = 50, attack = 5, defense = 0): self.health = health self.attack = attack self.defense = defense self.equipped_list = [] @property def is_alive(self): return self.health > 0 @property def god_heal (self): self.health = self.maxhealth def hit(self, other): other.health -= other.damage(self.attack) def damage(self, attack): return max(attack - self.defense, 0) def equip_weapon(self, weapon): if not isinstance(weapon, Weapon): weapon = weapon() list1 = [getattr(weapon,a) for a in dir(weapon) if not a.startswith('__')] list2 = [a for a in dir(weapon) if not a.startswith('__')] list3 = dict(zip(list2, list1)) for element in list3: if hasattr(self, element) and getattr(self,element) != 0: setattr(self, element, getattr(self, element) + list3[element]) self.equipped_list.append(weapon) def equip_weapon2(self,weapon): self.equipped_list.append(weapon) self.health += weapon.health self.attack += weapon.attack self.defense += weapon.defense self.vampirism += weapon.vampirism self.heal_power += weapon.heal_power class Vampire(Warrior): maxhealth = 40 name = 'vampire' def __init__(self): super().__init__(health = 40, attack = 4) self.vampirism = 50 def hit(self,other): other.health -= other.damage(self.attack) self.health = min(self.health + math.floor(self.vampirism / 100 * other.damage(self.attack)), self.maxhealth) class Weapon(): def __init__(self, health = 0, attack = 0, defense = 0, vampirism = 0, heal_power = 0): self.maxhealth = health self.health = health self.attack = attack self.defense = defense self.vampirism = vampirism self.heal_power = heal_power class Catana(Weapon): def __init__(self): super().__init__(health = -20, attack = 6, defense = -5, vampirism = 50)
Отредактировано Alexey_mne31 (Сен. 25, 2021 10:41:42)
Офлайн