Python类 - 帮助调用另一个类中的方法来更新实例中的属性

时间:2015-03-09 13:40:25

标签: python class methods

很抱歉,如果我的问题含糊不清,请先在stackoverflow上发帖。我想我在这里忽略了一些非常基本的东西,在课堂上经历了几个教程,但是在我的生活中无法找出我出错的地方。我的代码如下: -

class catalogue(object):

    def __init__(self, catalogueitem):
        self.catalogueitem = catalogueitem
        self.colors = []
        self.stock = "No Stock"

    def setStock(self, stock):
        if self.stock == "No Stock":
            self.stock = stock

class shop(object):

    def __init__(self, items):
        self.shopItems = []
        for item in items:
            self.shopItems.append(catalogue(item))

    def setStock(self, stock, item="purse"):
        self.shopItems.catalogue(item).setStock(stock)

newshop = shop( ["purse","handbag","wallet", "clutchbag"] )

newshop.setStock(10, "handbag")

基本上我要做的是从类商店中调用类目录中的方法,并在实例newshop中使用新的库存值10更新项目。我想我对如何做到这一点缺乏基本的了解,而且我认为我忽略了一些非常基本的东西,有人能帮我解决一下吗?

由于 贝蒂

2 个答案:

答案 0 :(得分:1)

致电时

self.shopItems.catalogue(item).setStock(stock)

您正在尝试调用self.shopItems对象的方法目录。问题是,self.shopItems是一个列表。我想你应该尝试使用这样的代码:

class catalogue(object):

    def __init__(self, catalogueitem):
        self.catalogueitem = catalogueitem
        self.colors = []
        self.stock = "No Stock"

    def setStock(self, stock):
        if self.stock == "No Stock":
            self.stock = stock

class shop(object):

    def __init__(self, items):
        self.shopItems = []
        for item in items:
            self.shopItems.append(catalogue(item))

    def setStock(self, stock, item="purse"):
        c = catalogue(item) #Instance the catalogue class
        c.setStock(stock) #Call the method setStock
        self.shopitems.append(c) #this adds the items into the instance, but # the original objects created by __init__ are still there, i.e. they've not # updated just added.

newshop = shop( ["purse","handbag","wallet", "clutchbag"] )

newshop.setStock(10, "handbag")

仅从商店类别更改了setStock的功能。

编辑1:

当你做self.shopItems = catalog(item)时,你会覆盖你拥有的东西 在列表中。你应该改为:

self.shopItems.append(catalogue(item))

并在最后一个元素后调用该方法:

self.shopItems[-1].setStock(stock)

结果是:

    def setStock(self, stock, item="purse"):
        self.shopItems.append(catalogue(item))
        self.shopItems[-1].setStock(stock)

编辑2:

好的,要更新现有项目,首先应检查它们是否存在,遍历列表:

    def setStock(self, stock, item="purse"):
        c = catalogue(item) #Instance the catalogue class
        c.setStock(stock) #Call the method setStock
        index = -1
        i = 0 #index
        for shItem in self.shopItems:
            if shItem.catalogueitem == item:
                index = i #Saves the index to update
                break #Breaks out of loop
            i += 1
        if index == -1:
            self.shopitems.append(c) #index wasn't updated, the item is new
        else:
            self.shopitems[index] = (c) #replaces the item info

答案 1 :(得分:0)

首先,您希望能够按名称查找商品。用于此的适当数据结构是字典(而不是列表)。因此,这会将商店的构造函数更改为:

def __init__(self, items):
    self.shopItems = {}
    for item in items:
        self.shopItems[item] = catalogue(item)

然后,很容易更新商店项目:

self.shopItems[item].setStock(stock)

每个shopItem 已经一个目录实例,因此您可以直接在其上调用setStock()。你应该先检查是否有这样的项目,否则你会抛出异常。例如,如果您致电newshop.setStock(10, 'bag') - 则没有此类项目。您可以按照以下方式防范:

def setStock(self, stock, item="purse"):
    if item not in self.shopItems:
        self.shopItems[item] = catalogue(item)
    self.shopItems[item].setStock(stock)