从已定义的类

时间:2017-06-27 22:59:45

标签: python python-3.x

这个赋值的目的是在Python中定义一个类,并用它来创建一个对象并显示它的组件。我已经创建了一个创建Inventory项目并显示信息的类,但是我在主类中添加了库存列表并显示用户友好信息时遇到了问题。我觉得这很容易实现,但我似乎无法弄明白。这是我到目前为止所拥有的。

class InventoryItem(object):
    def __init__(self, description, unit_cost, items_in_stock):
        self.description = description
        self.unit_cost = unit_cost
        self.items_in_stock = items_in_stock
        print('Description: ' + self.description)
        print('Item Costs: ' + str(self.unit_cost))
        print('Number in stock: ' + str(self.items_in_stock))


if __name__ == '__main__':
    inventory_list = []
    cookies = InventoryItem('Cookies', 5.00, 24)

    print(inventory_list)
    inventory_list.append(cookies)
    print(inventory_list)

我得到的输出是:

Description: Cookies
Item Costs: 5.0 
Number in stock: 24 
[]
[<__main__.InventoryItem object at 0x00E85A10>]

第一部分是预期的,除了我不知道为什么它似乎显示该数据的内存位置?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

有两种称为__str____repr__的魔术方法,可用于此类情况。默认情况下,如果未覆盖,则打印对象只会以您看到的<...>格式打印其内存内容。

区别? __repr__打印对象的表示(例如列表内)。 __str__是您在该对象上调用print()时看到的内容。

class InventoryItem(object):
    def __init__(self, description, unit_cost, items_in_stock):
        self.description = description
        self.unit_cost = unit_cost
        self.items_in_stock = items_in_stock

    def __str__(self):
        string = 'Description: ' + self.description + '\n'
        string += 'Item Costs: ' + str(self.unit_cost) + '\n'
        string += 'Number in stock: ' + str(self.items_in_stock)

        return string

    def __repr__(self):
        return self.__str__()

if __name__ == '__main__':
    inventory_list = []
    cookies = InventoryItem('Cookies', 5.00, 24)

    print(inventory_list)
    inventory_list.append(cookies)
    print(inventory_list)

输出:

[]
[Description: Cookies
Item Costs: 5.0
Number in stock: 24]

让我们在__str____repr__方法中稍微改变一下。这将帮助您理解两者之间的区别。

class InventoryItem(object):
    ...

    def __str__(self):
        string = 'Description: ' + self.description + '\n'
        string += 'Item Costs: ' + str(self.unit_cost) + '\n'
        string += 'Number in stock: ' + str(self.items_in_stock)

        return string

    def __repr__(self):
        return 'Hi!'

if __name__ == '__main__':
    inventory_list = []
    cookies = InventoryItem('Cookies', 5.00, 24)

    print(inventory_list)
    inventory_list.append(cookies)
    print(inventory_list)

打印:

[]
[Hi!]

现在,如果你致电print(cookies),你会得到这个:

Description: Cookies
Item Costs: 5.0
Number in stock: 24

如果您选择在班级中实施这些对象,请确保从这些方法中返回有效的str个对象。

答案 1 :(得分:2)

您需要做的是覆盖班级的__repr__方法。

像这样:

def __repr__(self):
    return 'Description: ' + self.description + ', Item Costs: ' + str(self.unit_cost) + ', Number in stock: ' + str(self.items_in_stock)