2013-11-11 3 views
1

Вот программа, которая должна задать ряд вопросов, сохранить информацию, а затем отобразить информацию обратно к вам. Всякий раз, когда я запускаю программу, она успешно запрашивает всю информацию, но дает ошибку при попытке отобразить определенную ее часть.Наследование класса? Python?

Ошибка:

Traceback (most recent call last): 
, line 27, in <module> 
    main() 
, line 24, in main 
    print ("Shift: ", worker.get_shift_number()) 
AttributeError: 'Worker' object has no attribute 'get_shift_number' 

Код:

# employee.py 
class Employee(object): 
    def __init__(self, name, id_number): 
     self.__id_number = id_number 
     self.__name = name 
    def set_name(self, name): 
     self.__name = name 
    def set_id_number(self, id_number): 
     self.__id_number = id_number 
    def get_name(self): 
     return self.__name 
    def get_id_number(self): 
     return self.__id_number 

class Worker(Employee): 
    def __init__(self, name, id_number, shift_number, pay_rate): 
     #call superclass __init__ method 
     Employee.__init__(self, name, id_number) 
     #initialize shift_number and pay_rate attributes 
     self.__shift_number = shift_number 
     self.__pay_rate = pay_rate 
     #mutator functions for shift_number and pay_rate 
     def set_shift_number(self, shift_number): 
      self.__shift_number = shift_number 
     def set_pay_rate(self, pay_rate): 
      self.__pay_rate = pay_rate 
     #accessor functions for shift_number and pay_rate 
     def get_shift_number(self): 
      return self.__shift_number 
     def get_pay_rate(self): 
      return self.__pay_rate 

Тогда мы имеем это.

#workerprogram.py 
import employee 

def main(): 
    #variables 
    worker_name= " " 
    worker_id = " " 
    worker_shift = 0 
    worker_pay = 0.0 

    #get data attributes 
    worker_name = input("Enter the worker name: ") 
    worker_id = input("Enter the ID number: ") 
    worker_shift = float(input("Enter the shift number: ")) 
    worker_pay = float(input("Enter the hourly pay rate: ")) 

    #create an instance of Worker 
    worker = employee.Worker(worker_name, worker_id, worker_shift, worker_pay) 

    #display information 
    print ("Production worker information: ") 
    print ("Name: ", worker.get_name()) 
    print ("ID number: ", worker.get_id_number()) 
    print ("Shift: ", worker.get_shift_number()) 
    print ("Hourly Pay Rate: $", worker.get_pay_rate()) 

main() 

Отказ не так, как указано, и я также видел, что у меня есть инициализация shift_number в неправильном месте. ; (

Спасибо

+1

Ваши комментарии и комментарии к коду о 'ProductionWorker', но ваш фактический код использует' Worker() '. Куда девался «ProductionWorker»? Если вы переименовали переменные, повторите запуск кода таким образом, чтобы * по крайней мере * ваше исключение соответствовало коду! –

+0

Ах, это я пишу плохие комментарии. Считайте их одинаковыми, и я отредактирую код, чтобы отразить аналогию. – user2901098

+4

Кроме того, не используйте геттеры и сеттеры в коде Python. Python - это не Java, просто используйте атрибуты напрямую. –

ответ

0

Поскольку Роб удалил его правильный ответ: Ваша проблема в том, что ваш отступы неправильно

Однако, это не единственная проблема с кодом Основным является то, что его!.. "более сложным, как у вас есть Accessors/мутаторов для всего, что не нужен, и будет просто еси время как для вас, набрав их, и компьютер их с помощью

Это как ваш код должен выглядеть:.

# employee.py 
class Employee(object): 

    def __init__(self, name, id_number): 
     self.id_number = id_number 
     self.name = name 

class Worker(Employee): 

    def __init__(self, name, id_number, shift_number, pay_rate): 
     #call superclass __init__ method 
     Employee.__init__(self, name, id_number) 
     #initialize shift_number and pay_rate attributes 
     self.shift_number = shift_number 
     self.pay_rate = pay_rate 

#workerprogram.py 
import employee 

def main(): 
    #variables 
    worker_name= " " 
    worker_id = " " 
    worker_shift = 0 
    worker_pay = 0.0 

    #get data attributes 
    worker_name = input("Enter the worker name: ") 
    worker_id = input("Enter the ID number: ") 
    worker_shift = float(input("Enter the shift number: ")) 
    worker_pay = float(input("Enter the hourly pay rate: ")) 

    #create an instance of Worker 
    worker = employee.Worker(worker_name, worker_id, worker_shift, worker_pay) 

    #display information 
    print ("Production worker information: ") 
    print ("Name: ", worker.name) 
    print ("ID number: ", worker.id_number) 
    print ("Shift: ", worker.shift_number) 
    print ("Hourly Pay Rate: $", worker.pay_rate) 

main() 

Хотя, по общему признанию, я не думаю, что вы действительно не хотите ни номера смены, ни ставки оплаты, как поплавки, но это может подождать еще одного вопроса.

+0

Помимо методов '__init __()', как насчет всех других определений методов, которые вы оставили? – martineau

+0

@martineau Они ничего не делали, кроме отработанных циклов процессора. –

+0

@martineau Нет, он получил этот совет бесплатно, потому что я хороший. Утверждение, что это не ООП, является абсолютной бессмыслицей. –

Смежные вопросы