2011-12-17 3 views
0

Я работаю с классами в Python 3, и мне сложно с ними работать. У меня здесь две программы (один импортируется в другой) Идея состоит в том, что вы составляете список сотрудников, и у вас есть три класса сотрудников Hourly, Salary и Volunteer.Python, работающий с классами

У меня, похоже, проблема с моим show_pay в каждом классе. Я также знаю, что в моем классе Salary я пытаюсь разделить строку на целое число, но так, как я написал код, я не совсем уверен, как обойти его. Мой класс Hourly, похоже, не печатает в списке.

Заранее спасибо. Я действительно смущен этим, и я пытаюсь пройти этот проект.

Первый проект (Employee)

#set global constant 
    SHIFT_2 = 0.05 
    SHIFT_3 = 0.10 

    #person class 
    class Person: 
     #initialize name, ID number, city 
     def __init__(self, name, ID, city): 
      self.__ID = ID 
      self.__name = name 
      self.__city = city 
     #display employee name 
     def show_person(self): 
      print('Name:', self.__name) 
      print('ID:', self.__ID) 
      print('City:', self.__city) 
     #display salary 
     def show_pay(self): 
      print('I make lots of money') 


     #return formatting  
     def __str__(self): 
      name_string = '(My name is ' + self.__name +')' 
      return name_string 

    # Hourly employee class 
    class Hourly(Person): 
     #initialize method calls superclass 
     def __init__(self, name, ID, city, base_pay, shift): 
      Person.__init__(self, name, ID, city) 
      self.__base_pay = base_pay 
      self.__shift = shift 

     #show_pay overrides the superclass and displays hourly pay rates 
     def show_pay(self): 
      if self.__shift == 1: 
       print('My salary is ', self.__base_pay) 
      elif self.__shift == 2: 
       print('My salary is ', (self.__base_pay * SHIFT_2) + self.__base_pay) 
      elif self.__shift == 3: 
       print('My salary is ', (self.__base_pay * SHIFT_3) + self.__base_pay) 

    #salary employee class 
    class Salary(Person): 
      #intialize method calls superclass 
     def __init__(self, name, ID, city, ann_salary): 
      Person.__init__(self, name, ID, city) 
      self.__salary = ann_salary 


     #show pay overrides superclass and displays salary pay rates 
     def show_pay(self): 
      print('I make ', self.__salary) 
      print('which is ', self.__salary // 26, 'every two weeks.') 


    #volunteer employee class 
    class Volunteer(Person): 
     def __init__(self, name, ID, city): 
      Person.__init__(self, name, ID, city) 

     def show_pay(self): 
       print('I am a volunteer so I am not paid.') 

Это основная программа

import employee 

    def main(): 
     #create list 
     employees = make_list() 

     #display list 
     print('Here are the employees.') 
     print('-----------------------') 

     display_list(employees) 

    def make_list(): 
     #create list 
     employee_list = [] 

     #get number of hourly employees 
     number_of_hourly = int(input('\nHow many hourly will be entered? ')) 
     for hourly in range(number_of_hourly): 
      #get input 
      name, ID, city = get_input() 

      base_pay = input('Enter employee base pay: ') 

      shift = input('Enter employee shift 1,2, or 3: ') 
      #create object 
      Hourly = employee.Hourly(name, ID, city, base_pay, shift) 
      #add object to list 
      employee_list.append(Hourly) 

     #get number of salary employees 
     number_of_salary = int(input('\nHow many salary will be entered? ')) 
     for salary in range(number_of_salary):  
      #get input 
      name, ID, city = get_input() 

      ann_salary = input('Enter employee annual salary: ') 
      #create object 
      salary = employee.Salary(name, ID, city, ann_salary) 
      #add object to list 
      employee_list.append(salary) 

     #get volunteers 
     number_of_volunteers = int(input('\nHow many other volunteers will be entered? ')) 
     for volunteers in range(number_of_volunteers): 
      #get info 
      name, ID, city = get_input()  
      #create object 
      volunteer = employee.Person(name, ID, city) 
      #add object to list 
      employee_list.append(volunteer) 


     #invalid object 
     employee_list.append('\nThis is invalid') 
     #return employee_list 
     return employee_list 

    def get_input(): 
     #input name 
     name = input("Employee's name: ") 
     #validate 
     while name == '': 
      print('\n Name is required. Try again.') 
      name = input("Employee's name: ") 

     ID_valid = False 

     ID = input("Employee's ID: ") 

     while ID_valid == False: 

      try: 
       ID = float(ID) 
       if ID > 0: 
        ID_valid = True 
       else: 
        print("\nID must be > 0. Try again.") 
        ID = input("Employee's age: ") 
      except ValueError: 
       print("\nID must be numeric. Try again.") 
       ID = input("Employee's ID: ") 

     #get city 
     city = input("Enter employee's city of residence: ") 

     #return values 
     return name, ID, city 



    def display_list(human_list): 
     #create for loop for isinstance 
     for human in human_list: 
      #create isinstance 
      if isinstance(human, employee.Person): 

       print(human) 

       human.show_person() 

       human.show_pay() 
       print 
      else: 
       print('Invalid employee object') 

    #call main function 
    main() 
+3

В чем ваш вопрос? Кроме того, вам не нужно добавлять все переменные класса с '__'. Это делает читаемость выполнимой. – Blender

+0

Я думаю, что с классами show_pay должен измениться до того, что он находится под этим конкретным классом (Hourly, Salary, или Volunteer), но по какой-то причине он не работает. Извините за __. Я новичок в этом, и то, что говорит моя книга, я не уверен в другом. –

+0

На самом деле - если вышеуказанное кодирование не работает, имена с префиксом '__' должны быть связаны с ним. Вероятно, вы где-то видели, что «это то, как частные свойства в Python» - это было бы неправильно, строго говоря. Но это может сделать код, подобный этой неисправности, довольно легко. Просто избавься от них. – jsbueno

ответ

1

Вы ввод зарплату в виде строки. Преобразуйте его.

ann_salary = int(input('Enter employee annual salary: ')) 
Смежные вопросы