2017-04-06 41 views
1

Person对象,已经有一个库存的支持,而当Person对象用Weapon对象或Food对象,该对象会去库存。对于Tribute对象,我想通过在Tributeget_weapons()中创建新方法来检索库存中的Weapon对象,该方法将返回Tribute目前在其库存中具有的Weapon对象的元组。AttributeError的:“RangedWeapon”对象有没有属性“所有者”

class Tribute(Person): 
    ... 
     def get_weapons(self): 
      self.weapons=[] 
      for item in self.get_inventory(): 
       if isinstance(item,Weapon): 
        self.weapons.append(item) 
      return tuple(self.weapons) 

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 

但我总是收到AttributeError: 'RangedWeapon' object has no attribute 'owner'。我不确定哪里出了问题。我真的很感谢一些帮助。谢谢!

import random 
from collections import OrderedDict 

###################### 
# Class: NamedObject # 
###################### 

class NamedObject(object): 
    def __init__(self, name): 
     self.name = name 

    def get_name(self): 
     return self.name 

####################### 
# Class: MobileObject # 
####################### 

class MobileObject(NamedObject): 
    def __init__(self, name, place): 
     super().__init__(name) 
     self.place = place 

    def get_place(self): 
     return self.place 

################ 
# Class: Thing # 
################ 

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 

################# 
# Class: Person # 
################# 

class Person(LivingThing): 
    def __init__(self, name, health, threshold): 
     self.inventory = [] 
     super().__init__(name, health, threshold) 

    def take(self, thing): 
     # Can only take things in current location and not owned by others 
     if isinstance(thing, Thing) and thing in self.place.objects and not thing.is_owned(): 
      thing.set_owner(self) 
      self.inventory.append(thing) 
      self.place.del_object(thing) 
      GAME_LOGGER.add_event("TOOK", self, thing) 
     else: 
      GAME_LOGGER.warning("{} cannot take {}.".format(self.get_name(), thing.get_name())) 

    def remove_item(self, thing): 
     #Can only remove things in inventory 
     if isinstance(thing, Thing) and thing in self.get_inventory() and thing.get_owner()==self: 
      thing.set_owner(None) 
      self.inventory.remove(thing) 
     else: 
      GAME_LOGGER.warning("{} does not own {}.".format(self.get_name(), thing.get_name())) 

    def go(self, direction): 
     new_place = self.place.get_neighbor_at(direction.upper()) 
     if new_place is not None: 
      self.move_to(new_place) 
     else: 
      GAME_LOGGER.warning("{} cannot go {} from {}".format(self.get_name(), direction, self.get_place().get_name())) 

    def get_inventory(self): 
     return list(self.inventory) 

    def objects_around(self): 
     return list(filter(lambda t: t is not self, self.get_place().get_objects())) 

    def get_exits(self): 
     return self.get_place().get_exits()` 



class Weapon(Thing): 

    def __init__(self, name, min_dmg, max_dmg): 
     self.name=name 
     self.min_dmg=min_dmg 
     self.max_dmg=max_dmg 

    def min_damage(self): 
     return self.min_dmg 

    def max_damage(self): 
     return self.max_dmg 

    def damage(self): 
     return random.randint(self.min_dmg,self.max_dmg) 

class RangedWeapon(Weapon): 

    def __init__(self, name, min_dmg, max_dmg): 
     super().__init__(name, min_dmg, max_dmg) 
     self.shots=0 

    def shots_left(self): 
     return self.shots 

    def load(self, ammo): 
     if ammo.weapon_type()==self.name: 
      self.shots+=ammo.get_quantity() 
      ammo.remove_all() 

    def damage(self): 
     if self.shots==0: 
      return 0 
     else: 
      self.shots-=1 
      return super().damage() 
+0

的Python版本? – FuzzyAmi

+0

@FuzzyAmi我使用python 3.6 – elle

回答

2

不是蟒蛇3.X的专家,但:

class Weapon(Thing): 

def __init__(self, name, min_dmg, max_dmg): 
    self.name=name 
    self.min_dmg=min_dmg 
    self.max_dmg=max_dmg 

你从来没有真正设置武器,从东西继承 - 你需要调用super().__init__行是适当的事情,在武器的构造函数。它令人讨厌的蟒蛇怪癖。在RangedWeapon的男星 - -

看看这里你这样做是正确的:

super().__init__(name, min_dmg, max_dmg) 
相关问题