Python 从包含对象的类中删除对象

Python 从包含对象的类中删除对象,python,class,oop,methods,typeerror,Python,Class,Oop,Methods,Typeerror,如何从包含对象的类中删除对象 这个问题听起来有点令人困惑。基本上,我有一个character类,它有一个清单——一个item对象列表。我在character类中的一个方法涉及从库存中删除一个项目。我知道为了做到这一点,我只需要做(listname)。删除(item),但是我遇到了错误。我不断得到“TypeError:'str'对象不可调用”,如果我尝试以下操作 player1.删除库存(库存[0]) 其中inv是对象列表 以下是我的物品和库存课程: 项目 class Item(object):

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

这个问题听起来有点令人困惑。基本上,我有一个character类,它有一个清单——一个item对象列表。我在character类中的一个方法涉及从库存中删除一个项目。我知道为了做到这一点,我只需要做(listname)。删除(item),但是我遇到了错误。我不断得到“TypeError:'str'对象不可调用”,如果我尝试以下操作

player1.删除库存(库存[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
@inventory.setter
def removeInventory(self, item):
    self.__inventory.remove(item)
为项目设置字符串

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
@inventory.setter
def removeInventory(self, item):
    self.__inventory.remove(item)
库存类别

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
删除项目的方法

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
@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)

在该属性中创建
属性
setter
函数时,每当对该属性进行赋值时,都会调用该函数。 那意味着你的

@inventory.setter
def removeInventory(self, item):
    self.__inventory.remove(item)
方法实际上会在有如下代码时调用:
(character)。inventory=item
- 大多数情况下,这不是您想要的(给定的项目将被删除,而不是添加到库存中,或者成为库存)


相反,要想使用
player1.removeInventory(inv[0])
调用它,只需将该方法保持为未修饰状态,而不使用
@属性。(…
装饰器

这不足以再现您的错误。例如,您没有包括设置
self.\u inventory
的位置。您的示例非常适合我,但我必须删除@inventory.setter行以避免“名称错误:未定义名称“inventory”。那么,错误一定在那里@jblasco我不需要setter属性来使用它吗?虽然在删除该行之后,该程序对我也起了作用……我不是setters方面的专家,但不,您不需要它们,它们只是更改某些属性值的方便方法。但是你需要给它们取完全相同的名字,看。在这里,您可以看到您需要更改名称removeInventory(对于inventory(对于setter)以便正确使用。但是,我不会这样做,因为我确信您只想添加和删除内容,所以类中的普通方法可以做到这一点!