返回一个元组对象
在Person
这个对象里,已经有了一个用来存放物品的地方,也就是“库存”。当Person
对象拿到一个Weapon
(武器)或者Food
(食物)对象时,这些物品就会放进库存里。对于我们的Tribute
对象,我们希望能够从这个库存中取出Weapon
和Food
对象。
我们需要在Tribute
类里创建一个新方法,叫做get_weapons()
,这个方法会返回一个包含Tribute
当前在库存里的Weapon
对象的元组。
class Tribute(Person):
def get_weapon(self):
for item in self.get_inventory():
if isinstance(item, self.RangedWeapon):
return tuple(item)
else:
pass
cc = Tribute("Chee Chin", 100)
chicken = Food("chicken", 5)
aloe_vera = Medicine("aloe vera", 2, 5)
bow = RangedWeapon("bow", 4, 10)
sword = Weapon("sword", 2, 5)
Base = Place("base")
Base.add_object(cc)
Base.add_object(chicken)
Base.add_object(aloe_vera)
Base.add_object(bow)
Base.add_object(sword)
cc.take(bow) # Chee Chin took bow
cc.take(sword) # Chee Chin took sword
cc.take(chicken) # Chee Chin took chicken
cc.take(aloe_vera) # Chee Chin took aloe_vera
def add_object(self, new_object):
if isinstance(new_object, Thing) or isinstance(new_object, LivingThing):
self.objects.append(new_object)
new_object.place = self
else:
GAME_LOGGER.warning("You can only add Thing or LivingThing to {}".format(self.get_name()))
def named_col(col):
# Only accepts tuple/list
type_col = type(col)
if type_col != list and type_col != tuple:
return None
return type_col(map(lambda x: x.get_name() if isinstance(x, NamedObject) else x, col))
当我尝试运行print(named_col(cc.get_weapons()))
时,出现了一个错误。
AttributeError: 'RangedWeapon' object has no attribute 'owner'
class Thing(MobileObject):
def __init__(self, name):
super().__init__(name, None)
self.owner = None
def set_owner(self, owner):
self.owner = owner
def get_owner(self):
return self.owner
def is_owned(self):
return self.owner is not None
RangedWeapon这个类之前已经在class RangedWeapon(Weapon):
中定义过了。
2 个回答
0
试试这个:
def get_weapons(self):
weapons = []
for item in self.get_inventory():
if isinstance(item, RangedWeapon):
weapons.append(item)
elif isinstance(item, Weapon):
weapons.append(item)
return tuple(weapons)
1
这里:
if isinstance(item, self.RangedWeapon):
return tuple(item)
你并不是在返回所有武器的一个元组,而是把一个命名元组转换成了普通元组,然后只返回了这个单独的对象。这就去掉了命名属性,所以才会出现错误。你需要做的是类似这样的:
def get_weapon(self):
weapons = []
for item in self.get_inventory():
if isinstance(item, RangedWeapon):
weapons.append(item)
return tuple(weapons)
你还应该把所有的代码(从get_weapon
开始,cc = Tribute("Chee Chin", 100)
往后)完全移出这个类,也就是说,把它们缩进减少一个层级。