如何从包含对象的类中删除对象?
这个问题听起来有点令人困惑。基本上,我有一个具有库存的字符类 - 项目对象列表。我在角色类中使用的一种方法是从库存中删除一个项目。我知道为了做到这一点,我只需要做(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)
答案 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))
装饰器。