Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性错误:';RangedWeapon';对象没有属性';所有者';_Python_Python 3.x_Oop - Fatal编程技术网

Python 属性错误:';RangedWeapon';对象没有属性';所有者';

Python 属性错误:';RangedWeapon';对象没有属性';所有者';,python,python-3.x,oop,Python,Python 3.x,Oop,在Person对象中,已经存在对库存的支持,当Person对象获取武器对象或食品对象时,该对象将进入库存。对于attribute对象,我想通过在attribute类中创建一个新方法get_-wearms(),从清单中检索武器对象,该方法将返回attribute当前在其清单中的武器对象的元组 class Tribute(Person): ... def get_weapons(self): self.weapons=[] for i

Person
对象中,已经存在对库存的支持,当
Person
对象获取
武器
对象或
食品
对象时,该对象将进入库存。对于
attribute
对象,我想通过在
attribute
类中创建一个新方法
get_-wearms()
,从清单中检索
武器
对象,该方法将返回
attribute
当前在其清单中的
武器
对象的元组

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'对象没有属性“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()

不是python 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
实际上,您从未将武器设置为从对象继承-您需要在武器的ctor中调用适用于对象的
super()。这是一个令人讨厌的python怪癖

看看这里——看看RangedWeapon的ctor——你做得对:

 super().__init__(name, min_dmg, max_dmg)

哪个python版本?@FuzzyAmi我正在使用python 3.6