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