2012-07-31 4 views
1

Моя цель с этой программой - записать 4 части информации (номер сотрудника, имя сотрудника, номер смены и тариф за час), а затем отобразить их. Мне нужно использовать классы в этой программе.Почему я получаю TypeError?

Вот код класса:

class Employee(object): 

    def __init__(self, name, number): 
     self.__name = name 
     self.__number - number 

    def set_name(self, name): 
     self.__name = name 

    def set_number(self, number): 
     self.__number = number 

    def get_name(self): 
     return self.__name 

    def get_number(self): 
     return self.__number 

class ProductionWorker(Employee): 

    def __init__(self, name, number, 
       shift, payRate): 

     Employee.__init__(self, name, number) 

     self.__shift = shift 
     self.__payRate = payRate 

    def set_shift(self, shift): 
     self.__shift = shift 

    def set_payRate(self, payRate): 
     self.__payRate = payRate 

    def get_shift(self): 
     return self.__shift 

    def get_payRate(self): 
     return self.__payRate 

Вот код, который импортирует код класса и выполняет его:

import employee 

name = input('Name: ') 
number = input('Employee Number: ') 
shift = input('Shift number (Enter 1 for day and 2 for night): ') 
payRate = input('Hourly Pay Rate: ') 

myEmployee = employee.ProductionWorker(name, number, 
          shift, payRate) 

print('--------------------') 
print('Employee Information') 
print('--------------------') 
print('Name:', myEmployee.get_name()) 
print('Employee Number:', myEmployee.get_number()) 
print('Customer number:', myEmployee.get_Shift()) 
print('Hourly Pay Rate:', myEmployee.get_payRate()) 

Хорошо, фиксированный тип:

myEmployee = employee.Employee(name, number, 
          shift, payRate) 

до:

myEmployee = employee.ProductionWorker(name, number, 
          shift, payRate) 

, но теперь я получаю эту ошибку:

Traceback (most recent call last): 
     File "C:/Users/Alex/Desktop/Programming Concepts/Homework 2/Chapter 13/Employee and Production Worker Class.py", line 9, in <module> 
     shift, payRate) 
     File "C:/Users/Alex/Desktop/Programming Concepts/Homework 2/Chapter 13\employee.py", line 24, in __init__ 
     Employee.__init__(self, name, number) 
     File "C:/Users/Alex/Desktop/Programming Concepts/Homework 2/Chapter 13\employee.py", line 5, in __init__ 
     self.__number - number 
    AttributeError: 'ProductionWorker' object has no attribute '_Employee__number' 

Еще раз спасибо за вашу помощь!

+3

'myEmployee = employee.Employee (имя, номер, сдвиг, payRate)' .. Это вызывает класс сотрудника .. вы должны позвонить ProductionWorker .. Вам нужно пересмотреть, как работает наследование. –

+1

Вы называете '__init__' для' Employee' похожим на 'ProductionWorker' –

+3

Вы слышали о свойствах Python? Python - это не Java ... так что забудьте этот сеттер и код getter raw. –

ответ

7

Изменить

myEmployee = employee.Employee(name, number, 
         shift, payRate) 

в

myEmployee = employee.ProductionWorker(name, number, 
         shift, payRate) 

Кроме того, кусок совет: пишущие методы получения и установки, как правило, frowned upon in Python. Просто убедитесь, что члены общественности и получить/установить их, как:

myEmployee.name = "David" 
print myEmployee.name 
+0

Я переработал свой код, чтобы исправить эту проблему, но я получаю еще одну ошибку. Есть идеи? Я очень ценю это! –

+1

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

+2

@AlexKiss: Вы хотели написать 'self .__ number = number', а не' self .__ number - number'. Тем не менее, я предлагаю вам внимательно изучить приведенные выше предложения и сделать их общедоступными ('self.number = number')! –

2

Просто измените следующие строки:

myEmployee = employee.Employee(name, number, 
         shift, payRate) 

в

myEmployee = employee.ProductionWorker(name, number, 
         shift, payRate) 

Я думаю, что может быть просто опечатка ..

2

Вы вводите Employee с ProductionWorker в свой основной код.

Заменить

myEmployee = employee.Employee(name, number,shift, payRate) 

по

myEmployee = employee.ProductionWorker(name, number,shift, payRate) 
Смежные вопросы