• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Komunikacja metod miedzy klasami

Object Storage Arubacloud
0 głosów
247 wizyt
pytanie zadane 23 marca 2021 w Python przez user125 Początkujący (400 p.)

Witam, pisze prosty kod symulacje kupna minerału, mam problem z zdefiniowaniem metody buy ktora miala by za zadanie kupic okreslona ilosc surowcow, pobierajac z portfela (czyli metody innej klasy) gotowke.

Czy moglbym w jakis sposob dac do zrozumienia klasie Coal aby pobrala wartosc mojej gotowki z konstruktora klasy  Portfel ?

 

class Portfel():
    def __init__(self,money):
        self.money=money

    @property
    def show_money(self):
        return self.money

    def __str__(self):
        return (f"Stan konta wynosi {self.money}  ")

    def buy(self,x):
        self.money-=x




class Mineral():
    def __init__(self,name,cena):
        self.name=name
        self.cena=cena

    def show(self):
        return self.cena

    def __str__(self):
        return (f"Cena {self.name} wynosi {self.cena}  ")


class Coal(Mineral):
    def buy(self):
        count_coal=0
        Portfel.buy(x*self.cena)
        count_coal+=1





if __name__ == '__main__':
    x=" "
    user=Portfel(1000)
    print(user)

    coal=Coal("coal", 200)
    print(coal)

    user.buy(x)
    print(user)










 

1 odpowiedź

0 głosów
odpowiedź 23 marca 2021 przez MamFarta Użytkownik (740 p.)

Możesz zrobić to na wiele sposobów, jednym z najbardziej intuicyjnych jest stworzenie metody buyMineral(Mineral) w definicji klasy Portfel przyjmującą jako argument Mineral, wtedy w tej metodzie wywołujesz metodę Mineral.show() i odejmujesz ją od właściwości money np. korzystając z metody, którą już napisałeś tj. buy.
Nie siedzę w Pythonie, więc napiszę w pseudo javascriptcie:

buyMineral(mineral){
  buy(mineral.show())
}

wtedy możesz wywołać w swoim mainie metodę na obiekcie typu portfel w sposób następujący:

user.buyMineral(coal)

Dodatkowo kilka uwag dotyczących twojego kodu:

- Jeśli piszesz program po angielsku (co jest b. dobrą praktyką i tak powinno się robić) to używaj w całym programie angielskiego nazewnictwa. Portfel powinien nazywać się Wallet, to samo z ceną.

- Metody, które zwracają wartości prywatnych właściwości to tak zwane gettery, nazwy metod 

show_money()

oraz 

show()

bardziej sugerują, że jakieś wartości będą nam pokazane (może wyprintowane ???), bardziej pasującymi nazwami byłyby getMoney() oraz getPrice()

komentarz 24 marca 2021 przez user125 Początkujący (400 p.)
Nie za bardzo rozumiem co ma sie stac w momencie gdy wywołam metodę Mineral.show(), nadal wyskakuje mi przy tej linijce bład, jak i rowniez przy wywolaniu w mainie tej funkcji
komentarz 24 marca 2021 przez MamFarta Użytkownik (740 p.)

metoda na Mineral.show() zwraca cenę danego minerału w twoim programie zgodnie z tą definicją:
 

def show(self):
        return self.cena

zatem możemy z niej skorzystać w naszej nowej metodzie buyMineral(mineral), która ma za zadanie odjąć od naszych pieniędzy cenę minerału mineral.

Dodatkowo skorzystamy jeszcze z drugiej metody, którą sam napisałeś. Mianowicie chodzi o Portfel.buy(x), która pomniejsza nasz portfel o liczbę x.

    def buy(self,x):
        self.money-=x


Działanie jest dosyć proste.

  • Wywołaj metodę mineral.show(), aby dostać cenę minerału przekazanego do buyMineral
  • Odejmij tę cenę od właściwości money, przechowywującą nasze aktualne pieniądze w portfelu

Zatem kod będzie wyglądał tak:

    def buyMineral(self, mineral):
      self.buy(mineral.show())

 

Poza tym, znalazłem w twoim kodzie błąd, w funkcji 'main' ustalasz zmienną x jako string, a później wywołujesz na niej odejmowanie, co kończy się błędem, poprawiłem to w poniższym kodzie, z zaimplementowaną funkcją buyMineral oraz prostym testem.

 

class Portfel():
    def __init__(self,money):
        self.money=money
 
    @property
    def show_money(self):
        return self.money
 
    def __str__(self):
        return (f"Stan konta wynosi {self.money}  ")
 
    def buy(self,x):
        self.money-=x
 
    def buyMineral(self, mineral):
      self.buy(mineral.show())
 
 
 
class Mineral():
    def __init__(self,name,cena):
        self.name=name
        self.cena=cena
 
    def show(self):
        return self.cena
 
    def __str__(self):
        return (f"Cena {self.name} wynosi {self.cena}  ")
 
 
class Coal(Mineral):
    def buy(self):
        count_coal=0
        Portfel.buy(x*self.cena)
        count_coal+=1
 
 
 
 
 
if __name__ == '__main__':
    x=" "
    user=Portfel(1000)
    print(user)
 
    coal=Coal("coal", 200)
    print(coal)
 
    user.buy(10)
    print(user)
    
    user.buyMineral(coal)
    print(user)

 

Podobne pytania

0 głosów
2 odpowiedzi 1,289 wizyt
pytanie zadane 6 sierpnia 2019 w Python przez Dominoday Początkujący (420 p.)
0 głosów
2 odpowiedzi 357 wizyt
0 głosów
4 odpowiedzi 624 wizyt
pytanie zadane 5 września 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...