Итак, я создал класс и хочу, что атрибут hp всегда остается между 0 и maxhp В теории принятия hp свойство должно дать мне желаемый результат: каким-то образом он не работает.Свойство класса не ограничивает атрибут
Есть ли способ связать атрибуты для и обратно? Поэтому я сохранил позицию объекта класса единицы. В 2-х местах, после позиции атрибута, которая содержит массив [x, y], а в другое время его хранит в 2 атрибутах x и y и каждый содержит int. Изменение self.x или self.y должно изменить self.position и наоборот.
class units(object):
def __init__(self,typus, position, stats):
self.type = typus
#they should be linked both directions
self.position = position
self.x = self.position[0]
self.y = self.position[1]
self.attack = stats[0]
self.defense = stats[1]
self.maxhp = stats[2]
self.hp = self.maxhp
def __repr__(self):
text = "This a %s at position [%s,%s].\n Attack: %s \n Defense: %s \n Hp : %s/%s \n " \
% (self.type,self.position[0],self.position[1], self.attack, self.defense, self.hp, self.maxhp)
return text
# hp set to always be in between 0 and maxhp
@property
def hp(self):
return self.__hp
@hp.setter
def hp(self, hp):
if hp < 0:
self.__hp = 0
if hp > self.maxhp:
self.__hp = self.maxhp
else:
self.__hp = hp
def takedmg(self,dmg):
self.hp -= max(dmg-self.defense, 0)
if self.hp <= 0:
self.alive = False
return self.hp
p = units("peasant", [1,1], [2,0,30])
p.takedmg(100)
print (p.hp) # it should be 0!
И вместе с изменения, приведенные в моем ответе, рассмотрим использование ['str.format()'] (https://docs.python.org/3/library/string.html#format-string-syntax) для длинного '__repr__'. – aneroid