从保存对象的类中删除对象

时间:2015-05-15 06:26:12

标签: python class oop methods typeerror

如何从包含对象的类中删除对象?

这个问题听起来有点令人困惑。基本上,我有一个具有库存的字符类 - 项目对象列表。我在角色类中使用的一种方法是从库存中删除一个项目。我知道为了做到这一点,我只需要做(listname).remove(item),但是我遇到了错误。我不断得到“TypeError:'str'对象不可调用”如果我尝试

这样的话

player1.removeInventory(INV [0])  其中inv是一个对象列表。

以下是项目和广告资源的课程:

物品

class Item(object):
    def __init__(self, itemType, value):
        self.__itemType = itemType
        self.__value = value

为商品

添加字符串
def __str__(self):
    out = ""
    out += "\nType: " + self.__itemType
    out += "\nValue: " + str(self.__value)
    return out

库存类

class Inventory(object):   #Aggregation from item
    def __init__(self, items):
    self.__items = items  #A list of items

为广告资源字符串

def __str__(self):
    out = ""
    out += "\nItems: "
    for x in self.__items:
        out += str(x)
    return out

清单是类中角色的参数。

角色等级

class Player(object): #Aggregation from Inventory
    def __init__(self, name, age, gender, playerClass, HP, ATK, DEF, inventory, gold = 0, level = 1, defending = False):
    self.__level = level
    self.__name = name
    self.__age = age
    self.__gender = gender
    self.__playerClass = playerClass
    self.__HP = HP
    self.__ATK = ATK
    self.__DEF = DEF
    self.__inventory = inventory ##list of items...###
    self.__gold = gold
    self.__defending = defending

使用属性获取广告资源

@property
def inventory(self):
    number = 1
    out = ""
    for item in self.__inventory:
        out += str(item)
        number +=1
    return out

删除项目的方法

@inventory.setter
def removeInventory(self, item):
    self.__inventory.remove(item)

我尝试过的代码

i1 = Item("Health potion", 1)
i2 = Item("Health potion", 1)
inv = [i1,i2]
player1 = Player("Brandon",19,"Male","Wizard", 100, 15, 10, inv, 200)
print(player1.inventory)
player1.removeInventory(inv[0])
print(player1.inventory)

1 个答案:

答案 0 :(得分:0)

在此属性中创建setter@inventory.setter def removeInventory(self, item): self.__inventory.remove(item) 函数时,只要对该属性进行分配,就会调用它。 这意味着你的

(character).inventory = item

当存在如下代码时,实际上会调用方法:player1.removeInventory(inv[0]) - 这大部分肯定不是你想要的(给定的项目将被删除而不是添加到库存中 - 或成为库存)

相反,要使用@property.(...)进行调用,只需保留未修饰的方法,而不使用print_r(array(4))装饰器。