Home > Blockchain >  Python terminal is printing the location of the object in a class not the data stored in the object
Python terminal is printing the location of the object in a class not the data stored in the object

Time:04-14

I have a class I've imported into a Python file. But my code is printing the location of the object not the data stored in the object. It is giving me this output, '<Chapter_10_Program_Exercise_5.RetailItem object at 0x10e281520>' which I think is the location but how can I change that? Here's the code and a picture of the python terminal output.

class RetailItem:

# __init__ method initializes the attributes.
def __init__(self, description, units, price):
    self.__item_description = description
    self.__units_in_inventory = units
    self.__price = price

# The set_item_description method gets the item type.
def set_item_description(self, description):
    self.__item_description = description

# The set_units_in_inventory method gets number of items available.
def set_units_in_inventory(self, units):
    self.__units_in_inventory = units

# The set_price method gets the cost of item.
def set_price(self, price):
    self.__price = price

# The get_item_description method returns the item type.
def get_item_description(self):
    return self.__item_description

# The get_units_in_inventory returns the number of items available.
def get_units_in_inventory(self):
    return self.__units_in_inventory

# The get_price method returns the cost of item.
def get_price(self):
    return self.__price

from Chapter_10_Program_Exercise_5 import RetailItem

class CashRegister:

# The __init__ method initializes the attributes.
def __init__(self):
    self.__items = []

def clear(self):
    self.__items = []

def purchase_item(self, retail_item):
    self.__items.append(retail_item)
    print('The item was added to the cash register.')   

def get_total(self):
    total_cost = 0.0

    # for loop
    for item in self.__items:
        total_cost = total_cost  item.get_price()
        return total_cost

def display_items(self):
    print('The items in the cash register are:')
    
    for item in self.__items:
        print(item)

PANTS = 1
SHIRT = 2
DRESS = 3
SOCKS = 4
SWEATER = 5

def main():
    pants = RetailItem('Pants', 10, 19.99)
    shirt = RetailItem('Shirt', 15, 12.50)
    dress = RetailItem('Dress', 3, 79.00)
    socks = RetailItem('Socks', 50, 1.00)
    sweater = RetailItem('Sweater', 5, 49.99)

sale_items = {PANTS:pants, SHIRT:shirt, DRESS:dress, SOCKS:socks, SWEATER:sweater}

register = CashRegister()
checkout = 'N'

while checkout =='N':
    
    # Call the get_user_option and it is assigned to the user_option
    user_option = get_user_option()

    # Sale_items of argument user_option is assigned to the item 
    item= sale_items[user_option]

    # If condition to check the items in the items_in_inventory

    if item.get_units_in_inventory()== 0:
        print('The item is out of stock.')
    else:
        register.purchase_item(item)
        
        # New item is updated and it is assigned to the new_item
        new_item = RetailItem(item.get_item_description(),
            item.get_units_in_inventory()-1,
            item.get_price())
        
        # Item is updated according to the user selected option
        sale_items[user_option] = new_item
        
        # The user input is assigned to the attribute checkout
        checkout = input('Are you ready to check out (Y/N)? ')
        print()
        
print('Your purchase total is:',\
    format(register.get_total(),'.2f'))
print()

register.display_items()

register.clear()

# Define the get_user_option() method to print the menu items

def get_user_option():
    print('Menu')
    print('-------------------')
    print('1. Pants')
    print('2. Shirt')
    print('3. Dress')
    print('4. Socks')
    print('5. Sweater')
    print()

option = int(input('Enter the menu number of the item you would like to purchase: '))
print()

while option > SWEATER or option < PANTS:

    option = int(input('Please enter a valid item number: '))

return option 

        
main()

Python Terminal Output

CodePudding user response:

This is how python manages the printing of objects. If you want to print attributes you need to tell python which representation you want for your object. You can do that by implementing these methods in the object class:

class RetailItem:
.
.
.

def __repr__(self):
     return "RetailItem()"

def __str__(self):
     return ""   self.__item_description   str(self.__units_in_inventory)   str(self.__price)

Note that the two methods will be automatically called in different situations:

>>> ri = RetailItem()
>>> ri
RetailItem()
>>> print(ri)
description 2.0 13.99

CodePudding user response:

Since all variables within RetailItem are private, you'd need to use the getter method (get_*()) to grab the info.

So to apply that to your display_items() method:


def display_items(self):
    print('The items in the cash register are:')

    for item in self.__items:
        print("Description: %s, Units in Inventory: %d, Price: %0.2f" %
              (item.get_item_description(),
               item.get_units_in_inventory(),
               item.get_price())
  • Related