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

Python programowanie obiektowe zadanie

Object Storage Arubacloud
0 głosów
1,167 wizyt
pytanie zadane 16 października 2017 w Python przez Prox Nowicjusz (150 p.)

Witam, mam problem z nastepujacym zadaniem "Utwórz w programie Opiekun zwierzaka mechanizm „tylnych drzwi”,
który pokazuje dokładne wartości atrybutów obiektu. Zrealizuj to poprzez
wyświetlenie obiektu po wprowadzeniu przez użytkownika ukrytej wartości,
która nie została uwzględniona w menu. (Wskazówka: dodaj specjalną metodę
__str__() do klasy Critter)."

Utworzylem odpowiednia metode ale nie mam pojecia jak ja wywolac aby poprawnie zadzialala, jestem strasznym laikiem jesli chodzi o programowanie wiec bardzo prosze o wytlumaczenie mi jak moge ja wywolac i w jaki sposob to dziala abym mogl rzeczywiscie zrozumiec dzialanie kodu i potrafil zastosowac go w kolejnych kodach :).

Estetyka kodu edytowanego przezemnie moze troszke przerazic ale jak wspomnialem wczesniej caly czas nad tym pracuje :)

# Opiekun zwierzaka
# Wirtualny pupil, którym należy się opiekować
t = 1
class Critter(object):
    """Wirtualny pupil"""
    def __init__(self, name, hunger = 4, boredom = 4):
        self.name = name
        self.hunger = hunger
        self.boredom = boredom

    def __pass_time(self, time_spend = 1):
        time_spend = 1
        self.hunger += time_spend
        self.boredom += time_spend
        print(self.boredom," nuda")
        print(self.hunger," głód")

    def __str__(self):
        rep = "Poziom glodu i nudy twojego zwierzaka to teraz\n"
        rep += "Imie: " + self.name + "Głód: " + crit.eat + "Nuda: " + crit.boredom
        return rep
        
    @property
    def mood(self):
        unhappiness = self.hunger + self.boredom
        if unhappiness < 5:
            m = "szczęśliwy"
        elif 5 <= unhappiness <= 10:
            m = "zadowolony"
        elif 11 <= unhappiness <= 15:
            m = "podenerwowany"
        else:
            m = "wściekły"
        return m
    
    def talk(self):
        print("Nazywam się", crit.name, "i jestem", self.mood, "teraz.\n")
        self.__pass_time()
    
    def eat(self, food = 4):
        
        print("Mniam, mniam.  Dziękuję.")
        self.hunger -= food
        if self.hunger < 0:
            self.hunger = 0
        self.__pass_time()

    def play(self, fun = 4):
        print("Hura!")
        self.boredom -= fun
        if self.boredom < 0:
            self.boredom = 0
        self.__pass_time()


def main():
    crit_name = input("Jak chcesz nazwać swojego zwierzaka?: ")
    crit = Critter(crit_name)
    
    choice = None  
    while choice != "0":
        print \
        ("""
        Opiekun zwierzaka
    
        0 - zakończ
        1 - słuchaj swojego zwierzaka
        2 - nakarm swojego zwierzaka
        3 - pobaw się ze swoim zwierzakiem
        """)
    
        choice = input("Wybierasz: ")
        print()
        
        # wyjdź z pętli 
        if choice == "0":
            print("Do widzenia.")

        # słuchaj swojego zwierzaka
        elif choice == "1":
            crit.talk()
        
        # nakarm swojego zwierzaka
        elif choice == "2":
            f = int(input("Wprowadz ilosc jedzenia 1-4:"))
            crit.food = f
            
            crit.eat()
            print(crit.food)
            print("Ilosc podanego jedzenia")
        # pobaw się ze swoim zwierzakiem
        elif choice == "3":
            t = int(input("Wprowadz ilosc czasu poswieconego na zabawe 1-4:"))
            crit.fun = t
            crit.time_spend = t
            crit.play()
            print(crit.fun)
        # nieznany wybór 
        elif choice == "sekret":
            
            print(crit)
            
        else:
            print("\nNiestety,", choice, "nie jest prawidłowym wyborem.")

main()
input("\n\nAby zakończyć program, naciśnij klawisz Enter.") 

 

1 odpowiedź

+1 głos
odpowiedź 16 października 2017 przez obl Maniak (51,280 p.)
wybrane 20 października 2017 przez Prox
 
Najlepsza

Jeżeli masz obiekt klasy Critter to możesz wywołać jego metodę __str__ np tak:

crittier  = Crittier("nazwa")
pint(str(crittier))

 

komentarz 16 października 2017 przez Prox Nowicjusz (150 p.)

Kiedy wywolalem kod odpowiedni do twojego czyli -

crit_name = input("Jak chcesz nazwać swojego zwierzaka?: ")
    crit = Critter(crit_name) 

#wywołanie
elif choice == "sekret":
            
            print(str(crit))

Otrzymalem kumonikat o błędzie

Traceback (most recent call last):
  File "C:\Users\Prox0\Desktop\opiekun_zwierzaka.py", line 106, in <module>
    main()
  File "C:\Users\Prox0\Desktop\opiekun_zwierzaka.py", line 101, in main
    print(str(crit))
  File "C:\Users\Prox0\Desktop\opiekun_zwierzaka.py", line 20, in __str__
    rep += "Imie: " + self.name + "Głód: " + crit.eat + "Nuda: " + crit.boredom
NameError: name 'crit' is not defined

 

komentarz 16 października 2017 przez obl Maniak (51,280 p.)

Przecież pisze jak wół: line 20 in __str__ .. bła bla bła ...   crit is not defined

Zrobiłeś babola w kodzie a ja mam się tłumaczyć:) Gdzie masz zmienną crit w twojej klasie? Bo w konstruktorze definiujesz tylko to:

    def __init__(self, name, hunger = 4, boredom = 4):
        self.name = name
        self.hunger = hunger
        self.boredom = boredom

 

komentarz 16 października 2017 przez Prox Nowicjusz (150 p.)
"ja mam się tłumaczyć:) " W zadnym stopniu nie mialem intencji aby obwiniac Cie za nie dzialanie kodu, napisalem bardzo szczatkowo i chodzilo mi o to ze potrzebowalem lekkiego prowadzenia za raczke :) Jak juz mowilem jestem poczatkujacym laikiem i staram sie dopiero zrozumiec na jakiej zasadzie dziala programowanie obiektowe :) Dziekuje bardzo za pomoc i przepraszam za mylaca wypowiedz :)
komentarz 17 października 2017 przez obl Maniak (51,280 p.)
Z tym "muszę się tłumaczyć" to taki trochę żart był, może nie udany ale żart :) Mam nadzieję, że wiesz już w czym problem tkwi  i sobie już poradziłeś.
komentarz 17 października 2017 przez Prox Nowicjusz (150 p.)

Tak wlasciwie to wczoraj odpuscilem walke z tym na pozniej.

Nie rozumiem dlaczego nie dziala poniewaz na poczatku definicji funkcji main() mam okreslenie crit = Critter(crit_name)

Poniewaz chce aby kod programu wyswietlil klase __str__ odpowiednia dla nazwy "zwierzaka" ktora wybral uzytkownik

def main():
    crit_name = input("Jak chcesz nazwać swojego zwierzaka?: ")
    crit = Critter(crit_name)
    
    choice = None  
    while choice != "0":
        print \
        ("""
        Opiekun zwierzaka
    
        0 - zakończ
        1 - słuchaj swojego zwierzaka
        2 - nakarm swojego zwierzaka
        3 - pobaw się ze swoim zwierzakiem
        """)
    
        choice = input("Wybierasz: ")
        print()
        
        # wyjdź z pętli 
        if choice == "0":
            print("Do widzenia.")

        # słuchaj swojego zwierzaka
        elif choice == "1":
            crit.talk()
        
        # nakarm swojego zwierzaka
        elif choice == "2":
            f = int(input("Wprowadz ilosc jedzenia 1-4:"))
            crit.food = f
            
            crit.eat()
            print(crit.food)
            print("Ilosc podanego jedzenia")
        # pobaw się ze swoim zwierzakiem
        elif choice == "3":
            t = int(input("Wprowadz ilosc czasu poswieconego na zabawe 1-4:"))
            crit.fun = t
            crit.time_spend = t
            crit.play()
            print(crit.fun)
        # nieznany wybór 
        elif choice == "sekret":
            
            print(str())
            
        else:
            print("\nNiestety,", choice, "nie jest prawidłowym wyborem.")

 

1
komentarz 18 października 2017 przez obl Maniak (51,280 p.)

Dobra, nie widzę sensu w tym aby do egzemplarza tej samej klasy odwoływać się z poziomu obiektu globalnego. A po drugie:

        rep += "Imie: " + self.name + "Głód: " + crit.eat + "Nuda: " + crit.boredom

crit.eat() <- bo to metoda jest

Powinieneś raczej zrobić to tak:

        rep += "Imie: " + self.name + "Głód: " + self.eat() + "Nuda: " + self.boredom

 

komentarz 23 października 2017 przez Prox Nowicjusz (150 p.)
Moze troszke pozno ale dziekuje za pomoc wszystko juz wiem ^^ Robilem babole bo slabo rozumialem programowanie obiektowe :) Przez ostatnie dni troszeczke sie tym bawilem i juz lepiej to rozumiem i wiem jak bezsensowne bledy robilem :) Dziekuje jeszcze raz ^^
komentarz 24 października 2017 przez obl Maniak (51,280 p.)
Cieszę się, że ci się udało.

Podobne pytania

0 głosów
1 odpowiedź 364 wizyt
0 głosów
2 odpowiedzi 429 wizyt
pytanie zadane 27 października 2018 w JavaScript przez kameleon Użytkownik (590 p.)
0 głosów
1 odpowiedź 359 wizyt
pytanie zadane 21 października 2018 w C i C++ przez leonka Nowicjusz (120 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!

...