返回一个元组对象

1 投票
2 回答
846 浏览
提问于 2025-04-18 01:59

Person这个对象里,已经有了一个用来存放物品的地方,也就是“库存”。当Person对象拿到一个Weapon(武器)或者Food(食物)对象时,这些物品就会放进库存里。对于我们的Tribute对象,我们希望能够从这个库存中取出WeaponFood对象。

我们需要在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)往后)完全移出这个类,也就是说,把它们缩进减少一个层级。

撰写回答