Witajcie,
Stawiam pierwsze kroki w pythonie, programowanie obiektowe spędza mi sen z powiek, może ktoś podpowie mi co jest nie tak z moim kodem i gdzie mogę go poprawić?
Moim zadaniem było utworzenie klasy ShoppingCart z atrybutem "products", który będzie przechowywał słownik z dodanymi produktami. W zadaniu nie zostało wyjaśnione jakie wartości mają przechowywać klucze (kluczem jest id produktu). Ponieważ metoda print_receipt ma podawać nazwę, cenę oraz, ilość i łączną cenę produktu oraz łączną kwotę za wszystkie produkty, uznałem, że będzie przechowywać dane o produkcie bez jego opisu. Metoda print_receipt ma także korzystać z metody get_total_sum w celu zliczenia łącznej ceny produktu.
Oto moje pytania:
- Czy istnieje możliwość jednoczesnego dodania nowego produktu (korzystając z metody add_product) do koszyka (słownik) products oraz stworzenia instancji produktu np wykorzystując tą metodę?
Wydaje mi się, że nie mogę tego zrobić, ponieważ metoda odnosi się do instancji, a wywołując ją przy pomocy klasy (ShoppingCart.add_product()) - wymaga ode mnie dodatkowego argumentu (self)
W tej chwili robię to następująco:
p2 = ShoppingCart('p2', 'p2', 10, 4) #wynik total_sum 40
p3 = ShoppingCart('p3', '3', 3, 40) #wynik total_sum 120
p2.add_product(p2)
p3.add_product(p3)
Wiem, że powyższy kod zadziała, ale dziwnie to dla mnie wygląda, że wywołuję metodę z poziomu instancji, a i tak muszę przekazać jej dane
- Nie potrafię wywołać metody print_receipt dla całej klasy (dla wszystkich instancji atrybutu products) bez odwołania się do konkretnego obiektu. Gdy odwołuję się bezpośrednio ShoppingCart.print_receipt() wyrzuca TypeError, missing 1 required positional argument: 'self' (rozumiem ten błąd)
Z kolei gdy odwołam się do metody poprzez instancję to, (w przypadku dodania wcześniej większej ilości produktów do koszyka) podlicza mi przy każdym produkcie ilości i ceny z danej instancji, łączna suma za wszystkie produkty też jest wtedy nieprawidłowa. Tutaj także rozumiem, że metoda self.get_total_sum() pobiera za każdym wykonaniem pętli dane tej samej instancji. Nie mam pomysłu jak zrobić to w sposób prawidłowy. Jak prawidłowo, z poziomu klasy, przy pomocy metody get_total_sum zrobić poprawne obliczenia.
print(p2.print_receipt()) # daje wynik 80
print(p3.print_receipt()) # daje wynik 120
Pradoopdobnie cały mój print można zrobić w bardziej pythonowy sposób, proszę o jakieś wskazówki.
class Product:
next_id = 1
def __init__(self, name, description, price, quantity):
self.name = name
self.description = description
self.price = price
self.quantity = quantity
self.id = Product.next_id
Product.next_id += 1
def get_total_sum(self):
return self.price * self.quantity
@property
def get_id(self):
return self.id
class ShoppingCart(Product):
products= {}
def add_product(self, new_product):
if new_product.get_id not in ShoppingCart.products:
ShoppingCart.products[new_product.get_id] = [self.name, self.price, self.quantity]
def remove_product(self, product_id):
if product_id not in ShoppingCart.products:
pass
elif ShoppingCart.products[product_id]:
ShoppingCart.products.pop(product_id)
def change_product_quantity(self, new_quantity):
ShoppingCart.products[self.id][-1] = new_quantity
def print_receipt(self):
total_amount = 0
for i in ShoppingCart.products:
print( f'{ShoppingCart.products[i][0]} - {ShoppingCart.products[i][1]}, '
f'{ShoppingCart.products[i][2]}, {self.get_total_sum()}')
total_amount += self.get_total_sum()
return f'Total amount = {total_amount}'