Python Obj定向编程-从另一个类访问名称

Python Obj定向编程-从另一个类访问名称,python,Python,方法: –构造函数不接受任何参数 –get_stock_names():返回一个字符串列表,该列表表示 库存中的所有食品 –has_stock(name):如果在库存中发现食品名称,则返回True –加载(食物):将食物对象添加到库存 –销售(名称):返回要销售的项目。要出售的物品是第一件 库存列表中与输入名称匹配的食物项。记住 从库存中取出已售出的食品。如果项目名称与任何 在列表中,返回None class Food(object): def __init__(self,name,nu

方法:

–构造函数不接受任何参数

–get_stock_names():返回一个字符串列表,该列表表示 库存中的所有食品

–has_stock(name):如果在库存中发现食品名称,则返回True

–加载(食物):将食物对象添加到库存

–销售(名称):返回要销售的项目。要出售的物品是第一件 库存列表中与输入名称匹配的食物项。记住 从库存中取出已售出的食品。如果项目名称与任何 在列表中,返回None

class Food(object):
    def __init__(self,name,nutrition,good_until):
        self.name = name
        self.nutrition = nutrition
        self.good_until = good_until
        self.age = 0

class FermentedFood(Food):
    def __init__(self,name,nutrition,good_after,good_until):
        super().__init__(name,nutrition,good_until)
        self.good_after = good_after
这些是以前定义的

class VendingMachine(object):
    def __init__(self):
        self.obj = []
    def load(self,food):
        self.obj.append(food)
        return self.obj
    def get_stock_names(self):
        return [i.name for i in self.obj]
    def has_stock(self,name):  # This part is wrong
        return  str(name) == self.obj
    def sell(self,name): # This part is wrong as well 
        if str(self.name) == self.obj:
            self.obj.remove(self.name)
        else:
            return None    


machine = VendingMachine()
apple = Food("apple", 70, 7)
banana = Food("banana", 100, 4)
yoghurt = FermentedFood("yoghurt", 50, 0, 10)
machine.load(banana)
machine.load(apple)
machine.load(yoghurt)
machine.load(apple)
print(machine.get_stock_names())  #["banana", "apple", "yoghurt", "apple"])
print(machine.has_stock("apple"))
print(machine.sell("apple")) #True
print(machine.get_stock_names()) ##Since apple is sold so `["banana", "yoghurt", "apple"]`
那么
有没有股票
卖出
的问题呢

那么,你的股票和股票有什么问题吗

检查
str(name)
是否等于
self.obj
,这是一个列表。您想检查您传入的
名称
是否在
self.obj
中,这是一个有名称的
食品
列表。您需要将其更改为以下内容:

def has_stock(self, name):
    return name in [x.name for x in self.obj]
这将列出
食品的名称,并检查您输入的名称是否在该列表中


在这里,您会犯类似的错误,将字符串与列表进行比较。另一个错误是,
self.name
不存在。应将该部分更改为:

def sell(self, name):
    for food in self.obj:
        if food.name == name:
            self.obj.remove(food)
            return food
    return None    
这将在食物清单上循环。如果它发现一个
食物
名称与您输入的名称匹配,它将从列表中删除
食物
,然后返回它(我不确定您为什么要返回它,但这取决于您)。如果没有找到匹配项,代码将继续通过循环,并将
返回None

这就是我得到的结果:

['banana', 'apple', 'yoghurt', 'apple']
True
<__main__.Food object at 0x00000000029CBB38>
['banana', 'yoghurt', 'apple']
[‘香蕉’、‘苹果’、‘酸奶’、‘苹果’]
真的
[‘香蕉’、‘酸奶’、‘苹果’]

那么,问题是什么?你的问题是什么?我已经编辑了alreadyDidn不适用于machine.get_stock_names()我得到[]然后machine.load(banana)给我None@TimIt适用于我,所以我不确定这是怎么回事。也许最好发一个新问题
def sell(self, name):
    for food in self.obj:
        if food.name == name:
            self.obj.remove(food)
            return food
    return None    
['banana', 'apple', 'yoghurt', 'apple']
True
<__main__.Food object at 0x00000000029CBB38>
['banana', 'yoghurt', 'apple']