Problem z metodą, która odkłada część wypłaty na konto oszczędnościowe

0

Witajcie,
mam drobny problem z klasami i metodami.
Mógłby mi ktoś podpowiedzieć jak "sprytnie" dodać 3% z wypłaty na konto oszczędnościowe bez dublowania pytania o wynagrodzenie i przepracowane godziny?

class Employee():
    def __init__(self, name, ID, departament, title, h_sal=0, h_week=0):
        self.name = name
        self.ID = ID
        self.departament = departament
        self.title = title
        self.h_sal = h_sal
        self.h_week = h_week

    def salary(self, week_salary=0):
        h_sal = int(input("\nHow much PLN do you earn per hour: "))
        h_week = int(input("How many hours do you work per week: "))
        if h_week > 35:
            extra = (h_week - 35) * h_sal * 1.5
            week_salary = h_sal * 35 + extra
            return week_salary
        else:
            week_salary = h_sal * h_week
        return week_salary
    def pension(self):
        print("\nyou can save 3% of your salary on your pension Account")
        answer = input("Are you interested? YES/NO: ")
        if answer == "YES":
            return self.salary()*0.03
        else:
            return "OK, no problem!"
employee1 = Employee("Damian", 1, "IT", "Python Developer")

print("""
        0 - exit
        1 - check your salary
        2 - save money on pension account""")
a = ""
while a!=0:
    a = int(input("\nWhich option would you like to choose: "))
    if a == 1:
        print("Salary: ",employee1.salary())
    elif a == 2:
        print("Your salary:",employee1.salary(), "\nYou have saved: ",employee1.pension())
    else:
        print("I dont understand")
        break
1
  1. Dodać argument do metody salary(). W zależności od jego wartości będziesz pytał o zarobki:
employee1.salary(True)
# ...
employee1.salary(False)
  1. Zapamiętać, że metoda salary() już raz była wywołana i za drugim razem nie będziesz w niej pytać o zarobki...

Możliwości jest wiele, ale musisz wybrać rozwiązanie odpowiednie do sytuacji.

1

Poza głownym tematem, cierpią nazwy metod. Są rzeczownikami a nie czasownikami (to by przeżył), ale są przez to bardzo ogólne, nie wyznaczają mentalnie co metoda ma robić.

Np gdyby metoda sie nazywała ask_for_salary - to by lepiej wspkazywał, o co kaman (interakcje z użytkownikiem), i szybciej by się pojawiał pomysł jak zrobić te 3%

(pominę, że nt płacowe ja już nie umiem myśleć po angielsku, he he)

3
  1. Zmieniłbym nazwę z Employee na EmployeeAccounting, SalaryCalculator albo coś w tym stylu. Zależy co to klasa ma reprezentować. Samo Employee nie zamknięte w innym pakiecie sugeruje trochę inny typ trzymanych danych.
  2. Wywaliłbym obsługę i/o z klasy, i/o robiłbym w funkcji sterującej.
  3. To, że pension coś zwraca, w zależności od I/O to dziwna sprawa.
  4. To, że pension zwraca string lub jakąś kwotę jest jeszcze dziwniejsze. Kwota nie jest pensją, tylko 3% wynagrodzenia, więc kolejne wtf. To nie ma sensu. Na pewno o to chodziło?
  5. Jeżeli pracownik odkłada gdzieś część wypłaty (3%), to może zapisać tą informację w klasie ? Dzięki temu nie będziesz się musiał o to pytać przy pomocy i/o drugi raz.
  6. Salary da się zapisać bez ifów, przy pomocy matematyki (hint: min, max)
  7. Salary zwraca week_salary. Może jednak metoda powinna nazywać się week_salary albo get_week_salary
  8. Przy operowaniu na double aby obliczyć kwotę odkładaną na konto uważaj na błędy zaokrąglenia, bo pracownik będzie stratny :)
45

Ja bym w ogóle te inputy wywalił poza klasę.

0
ledi12 napisał(a):

Ja bym w ogóle te inputy wywalił poza klasę.

Jak wywalę inputy poza klasę to nie działa, chyba, że ew ja coś źle robię.

Finalnie program działa, ale nie jestem z niego zadowolony. Po pracy będę próbować jakoś go optymalizować i zmienię nazwy klas/metod

list =[]
class Employee():
    def __init__(self, name, ID, departament, title, h_sal=0, h_week=0):
        self.name = name
        self.ID = ID
        self.departament = departament
        self.title = title
        self.h_sal = h_sal
        self.h_week = h_week

    def salary(self, week_salary=0):
        h_sal = int(input("\nHow much PLN do you earn per hour: "))
        h_week = int(input("How many hours do you work per week: "))
        if h_week > 35:
            week_salary = h_sal * 35 + (h_week - 35) * h_sal * 1.5
        else:
            week_salary = h_sal * h_week

        return week_salary
    def pension(self):
        print("\nyou can save 3% of your salary on your pension Account")
        answer = input("Are you interested? YES/NO: ")
        if answer == "YES":
            h_sal = int(input("\nHow much PLN do you earn per hour: "))
            h_week = int(input("How many hours do you work per week: "))
        if h_week > 35:
            week_salary = h_sal * 35 + (h_week - 35) * h_sal * 1.5
            pension = week_salary* 0.03
            print("Your salary:", week_salary,"\nPension on your bank account:", pension)

        else:
            week_salary = h_sal * h_week
            pension = week_salary * 0.03
            print("Your salary shold be: ", week_salary,"Pension on your bank account: ", pension)
employee1 = Employee("Damian", 1, "IT", "Python Developer")



while True:
    print("""
        0 - exit
        1 - check your salary
        2 - save money on pension account""")
    a = int(input("\nWhich option would you like to choose: "))
    if a == 1:
        print("Salary: ",employee1.salary())
    elif a == 2:
        employee1.pension()
    else:
        print("I dont understand")
        break
0

Nie do konca rozumiem co chcesz osiagnac (a Twoj kod w tym nie pomaga), ale:
Moze niech zmienne z metody salary tj. h_sal i h_week beda ustawialy pola w obiekcie? Przykladowo bedziesz robil cos takiego:

        self.h_sal = int(input("\nHow much PLN do you earn per hour: "))
        self.h_week = int(input("How many hours do you work per week: "))

Przez co nie bedziesz musial w metodzie pension po raz kolejny odpytywac o te wartosci.

Dlaczego metoda salary ma argument week_salary skoro to jest wlasnie cos co zwracasz z tej metody?

I taki maly tip:

        answer = input("Are you interested? YES/NO: ")
        if answer == "YES":

Zamien na:

        answer = input("Are you interested? YES/NO: ")
        if answer.lower() == "yes":

Dzieki czemu bedziesz lapac zarowno "yes", "YES" jak i wszystkie kombinacje z wielkimi literami typu "Yes" itd.

44
Ignacy napisał(a):
ledi12 napisał(a):

Ja bym w ogóle te inputy wywalił poza klasę.

Jak wywalę inputy poza klasę to nie działa, chyba, że ew ja coś źle robię.

Finalnie program działa, ale nie jestem z niego zadowolony. Po pracy będę próbować jakoś go optymalizować i zmienię nazwy klas/metod

list =[]
class Employee():
    def __init__(self, name, ID, departament, title, h_sal=0, h_week=0):
        self.name = name
        self.ID = ID
        self.departament = departament
        self.title = title
        self.h_sal = h_sal
        self.h_week = h_week

    def salary(self, week_salary=0):
        h_sal = int(input("\nHow much PLN do you earn per hour: "))
        h_week = int(input("How many hours do you work per week: "))
        if h_week > 35:
            week_salary = h_sal * 35 + (h_week - 35) * h_sal * 1.5
        else:
            week_salary = h_sal * h_week

        return week_salary
    def pension(self):
        print("\nyou can save 3% of your salary on your pension Account")
        answer = input("Are you interested? YES/NO: ")
        if answer == "YES":
            h_sal = int(input("\nHow much PLN do you earn per hour: "))
            h_week = int(input("How many hours do you work per week: "))
        if h_week > 35:
            week_salary = h_sal * 35 + (h_week - 35) * h_sal * 1.5
            pension = week_salary* 0.03
            print("Your salary:", week_salary,"\nPension on your bank account:", pension)

        else:
            week_salary = h_sal * h_week
            pension = week_salary * 0.03
            print("Your salary shold be: ", week_salary,"Pension on your bank account: ", pension)
employee1 = Employee("Damian", 1, "IT", "Python Developer")



while True:
    print("""
        0 - exit
        1 - check your salary
        2 - save money on pension account""")
    a = int(input("\nWhich option would you like to choose: "))
    if a == 1:
        print("Salary: ",employee1.salary())
    elif a == 2:
        employee1.pension()
    else:
        print("I dont understand")
        break

Po prostu zrób z tych inputow argument dla klasy / metody. Raz, że poprawisz czytelność kodu, dwa kod stanie łatwiejszy do przetestowania.

3
Ignacy napisał(a):
ledi12 napisał(a):

Ja bym w ogóle te inputy wywalił poza klasę.

Jak wywalę inputy poza klasę to nie działa, chyba, że ew ja coś źle robię.

Tzn, że coś źle zrobiłeś. Wstawienie tych inputów w tą klasę jest brzydkie i miesza odpowiedzialności. Spróbuj w ten sposób (reszta do przemyślenia):

salary_per_hour = int(input("How much PLN do you earn per hour: "))
hours_per_week = int(input("How many hours do you work per week: "))
saving = input("You can save 3% of your salary on your pension Account. Are you interested? YES/NO: ").lower() in ("yes", "y")

employee_accounting = EmployeeAccounting(salary_per_hour, hours_per_week, saving)

Finalnie program działa, ale nie jestem z niego zadowolony. Po pracy będę próbować jakoś go optymalizować i zmienię nazwy klas/metod

+1 Za to, że nie jesteś zadowolony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1