【问题标题】:removing an object from a class holding objects从持有对象的类中删除对象
【发布时间】:2015-07-26 23:41:56
【问题描述】:

如何从持有对象的类中删除对象?

这个问题听起来有点令人困惑。基本上,我有一个角色类,它有一个清单 - 一个项目对象列表。我在角色类中的一种方法是从库存中移除物品。我知道为了做到这一点,我只需要做 (listname).remove(item),但是我遇到了错误。如果我尝试诸如

之类的东西,我会不断收到 "TypeError: 'str' object is not callable"

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)

【问题讨论】:

  • 这不足以重现您的错误。例如,您不包括设置self.__inventory 的位置。
  • 您的示例非常适合我,但我必须删除 @inventory.setter 行以避免“NameError: name 'inventory' is not defined”。那么错误一定是存在的!
  • @jblasco 我不需要 setter 属性来使用它吗?尽管删除该行后该程序也对我有用...
  • 我不是 setter 方面的专家,但是不,您不需要它们,它们只是更改某些属性值的便捷​​方法。但是您需要将它们命名为完全相同,请参见 python-course.eu/python3_properties.php 。在那里,您可以看到您需要更改名称 removeInventory( 以便让 inventory( 正确使用 setter。不过,我不会这样做,因为我确定您只是想添加和删除东西,因此,您班级中的普通方法可以解决问题!

标签: python class oop methods typeerror


【解决方案1】:

当您在此属性中创建propertysetter 函数时,只要对该属性进行赋值,就会调用它。 这意味着你的

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

当有如下代码时,方法实际上会被调用:(character).inventory = item - 这主要是确定不是您想要的(给定的项目将被删除而不是添加到库存中 - 或成为库存)

相反,要使用player1.removeInventory(inv[0]) 随意调用它,只需保持方法未装饰,不使用@property.(...) 装饰器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2021-09-11
    • 2021-08-03
    • 2018-07-30
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多