Python Forum

Full Version: Help with lists and class objects
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
So, I want to make an inventory system, if the user has an item, it puts it into a list called inventory. The item is an object inside a class, and if I put the object from the class into the inventory list and when I print out the inventory, I want to show up as the the items name.

inventory = []

class items():
    def __init__(self, item):
        self.item = item

sword = items('sword')
inventory.append(sword)

print(inventory)
I want it to print Sword, not [<__main__.items object at 0x7f36f0a8a750>]
hopefulle I explained this decently, I'm new to Python :)
For that, you'll need to write some code for items.__repr__(). That dunder method is called whenever the object is printed.
Sorry but I don't understand what __repr__() is, would you mind explaining? and how would I add that to my code?
(Jan-13-2020, 07:21 PM)AlluminumFoil Wrote: [ -> ]would you mind explaining? and how would I add that to my code?
inventory = []
class Items:
    def __init__(self, item):
        self.item = item

    def __str__(self):
        return f'The item is: {self.item}'

    def __repr__(self):
        return f'Items({self.item!r})'
Use:
>>> sword = Items('sword')
>>> 
>>> # Call __str__
>>> print(sword)
The item is: sword
>>> 
>>> # Call __repr__
>>> sword
Items('sword')
This is a standard way to use it.
__str__ here can add text that give more info about the object.
__repr__ Give raw info about object intended more as a aid for developers and debugging.
Ok so the problem with that is that I have more than one one thing inside. for example, I don't have only 'item' inside the __init__, It looks more like this:

def __init__(self, item, attack, sell_price, buy_price)
So I want to make it that when I print the inventory list, it shows a list of the objects inside, not the attack, not the sellprice, etc. Only the item. I've been researching it and I cannot find anything about this at all.
__str__ and __repr__ will still work. Just decide what you want to print. As you have been shown above you can define what attributes are printed:

def __str__(self):
return "self.item"  # will display just the name of the item.

def __str__(self):
return f"This item is a {self.item}. It attacks for {self.attack} damage!" # Displays a fancy message about item.
BTW, it's confusing to use "item" as the name of your Items. How about "name"?
and how would I call out the __str__? like I put that in my class,
def __str__(self):
    return f"self.item"
like when I want to append sword to the inventory list, and then print out what's above
That's the beauty of over-riding the magic methods (also called "dunders" for double underscores). You don't have to do anything else. Any time your object gets printed, __str__ will get called and whatever you defined in it will be printed. See how when I "print(thing1)" it just works. Pretty useful!

class Items():
    """ Base class of Player's items. """
    
    inventory = [] # Static class attribute to hold all items.  Note that it's IN the class.
    
    def list_items(): # Static method to print the items in the static inventory. 
        for i in Items.inventory:
            print(i)

    def __init__(self, name, desc):
        """ Constructor for the Items class. """

        self.name = name
        self.description = desc
        self.attack = 10
        self.defense = 10
        self.value = 25
        Items.inventory.append(self)

    def __str__(self):
        return self.name

    def show_item_info(self):
        print("-----------------------------------------")
        print(f"Item name: {self.name}")
        print(self.description)
        print(f"Attack: {self.attack} / Defense: {self.defense}")
        print("-----------------------------------------")

# Instantiate a couple items:
thing1 = Items("Iron Sword", "A rusty iron short sword that badly needs a blacksmith.")
thing2 = Items("Wooden Shield", "A tattered, oak shield that has seen better days but does the job.")

# Print some output about the Items:
print(thing1)  # Just USE it.  Works since you over-rode __str__ "magic method"!

thing2.show_item_info()

Items.list_items()

I guess I should have mentioned that overriding __str__() and __repr__() is not the only way to print stuff from a class instance. As you see in my code I also added a fancy, multi-line show_item_info() method that simply prints lines that happen to contain several attributes from the class. Of course you can combine the techniques too. You could make a nice printout of all the items in the inventory as a pretty 2D table but leave out the descriptions...
Hello again, unfortunately, I'm still having problems with this, I don't know what I'm doing wrong at this point, but would you or anyone be able to look over my code and see what I'm doing wrong?

Line 16 is where the class I'm working with at the moment, ignore the other classes, I'll work on those later.
Line 65 is all the objects for the class at Line 16.
Line 351 is where I'm attempting to print the inventory as a list.

I created a file in Github, i don't know if I set it up right, so here's the link anyways.
https://github.com/DankRupped/Crates/tree/master
Thank you guys for all the help
Pages: 1 2