Python Forum

Full Version: Problems with understanding class index.
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
class Store():
    Money = 5.00
    Day = 1
    Stores = []
    def __init__(self,StoreName,StoreProfit,storecost):

        self.StoreName = StoreName
        self.StoreCount = 0
        self.StoreProfit = StoreProfit
        self.StoreCost = storecost

    def BuyStore(self):
        whichStore = int(input("Which store do you wish to buy?"))
        store = Store.Stores[whichStore-1]
        if store.StoreCost <= Store.Money:
            store.StoreCount+=1
            Store.Money -= store.StoreCost
        else:
            print("You do not have enough money")

    @classmethod
    def DisplayGameInfo(cls):
        print("--------------------")
        print("Day # "+str(cls.Day))
        print("Money = $"+str(cls.Money))
        i = 1
        for store in cls.Stores:
            store.DisplayStoreInfo(i)
            i+=1


    def DisplayStoreInfo(self,i):
        print("Store name # "+ str(self.StoreName))
        print("Money = $"+str(Store.Money))
        print("Store Count " + str(self.StoreCount))
        print(str(i))


    def NextDay(self):
        Store.Day+=1
        DailyProfit = self.StoreProfit * self.StoreCount
        Store.Money += DailyProfit


Store.Stores.append(Store('Lemonade Stand',1.5,3))
Store.Stores.append(Store('Record Store',5,15))
Store.Stores.append(Store('Ice Cream Shop',10,90))




while True:
    Store.DisplayGameInfo()
    print("Available options N, B, Q")
    result = input("Please enter your selection")
    if result == 'B' or result == 'b':
       Store.Stores[0].BuyStore()
    elif result == 'N' or result == 'n':
        Store.Stores[0].NextDay()
    elif result == 'Q' or result == 'q':
        break
    else:
        print("Bad input")


print("Thank you for playing Python Idle Tycoon")
The problem is with the logic inside of of the while loop. Store.Stores[0].BuyStore() and Store.Stores[0].NextDay() Why is the index 0 for Stores - wouldn't that just call the first class everytime? Though, when testing it - it doesn't follow. It doesn't seem to change anything no matter what the index is. I'm afraid I don't understand what's happening here. Secondly. How is Store.Stores[0].NextDay() working at all. I understand you're calling the class store and then the class variable that's a list, but what does that list have to do with NextDay which is its own instance method?

If this is TL;DR How is this working? Primarily the '0' Index? From my understanding it should just access the Lemonade Stand everytime.
if result == 'B' or result == 'b':
       Store.Stores[0].BuyStore()
    elif result == 'N' or result == 'n':
        Store.Stores[0].NextDay()
It is not well written code.

BuyStore() and NextDay() should be a class methods. They don't use an instance variables. Since they are essentially class methods it doesn't matter which instance of Store is used to call them.

I also don't like that you have to explicitly add stores to Store.Stores. This should happen automatically in the __init__ method.
I agree with @deanhystad This code is a mess
And there is serious problem with NextDay and how it calculates DailyProfit - it uses only StoreProfit for store at index 0 (the store on which instance the method is called), i.e. 5 while e.g. IceCream Store has DailyProfit 0f 10
Yeah, I should've probably prefaced that I was following a course. The instructor pretty much put it like this but talked about the problems in the QandA thread. I believe I have a better grasp on what is actually going on. I just paused the video because I assumed that the code was not going to work as intended(as you've stated) Nonetheless, I appreciate the response despite the spaghetti code. It was fixed later down the line as well.