2014-12-15 5 views
0

Я исследовал всюду, и хотя я нахожу те же самые понятия, я не могу найти ответ на мою ошибку.Unbound Error Python Class

Я не писал ранее, потому что моя учетная информация была забыта в стеке, но я сильно расстроился с ошибкой этого новичка.

class Person(object): 

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

class Employee(Person): 

    total_salary = 0 

    @staticmethod 
    def total_salary(self, salary): 
     return total_salary 


    def __init__(self, name, phone, salary): 
     self.name = name 
     self.phone = phone 
     self.salary = salary 




class Student(Person): 

    def __init__(self, name, phone, gpa): 
     self.gpa = gpa 
     self.name = name 
     self.phone = phone 

    def __str__(self): 
     reply = "" 
     reply = "Person " + self.name + " has phone " + self.phone + "\n" + " and is a Student with gpa " + str(self.gpa) 
     return reply 

class Professor(Employee): 
    def __init__(self, name, phone, salary, clas_teach): 
     self.clas_teach = clas_teach 
     self.name = name 
     self.phone = phone 
     self.salary = salary 

    def __str__(self): 
     reply = "" 
     reply = "Person " + self.name + " has phone " + self.phone + "\n" + " and is an Employee with salary " + str(self.salary) + "\n" 
     reply += " and is a Professor assigned to class " + self.clas_teach 
     return reply 

class Staff(Employee): 
    def __init__(self, name, phone, salary, position): 
     self.position = position 
     self.name = name 
     self.phone = phone 
     self.salary = salary 
    def __str__(self): 
     reply = "" 
     reply = "Person " + self.name + " has phone " + self.phone + "\n" + " and is an Employee with salary " + str(self.salary) + "\n" 
     reply += " and is Staff with title " + self.position 
     return reply 
# Create a list of people 
People = [ Student("Sandy", "326-8324", 3.65), Student("Jordan", "632-7434", 3.1), \ 
      Professor("Leslie", "985-2363", 50000.00, "Info 501"), \ 
      Staff("Alex", "743-4638", 25000.00, "Editor") ] 

# display information about our people 
print "These are the people in the university:" 
for person in People: 
    print person 

# display the total salaries of all our employees and average GPA 
# of all of our students 
print 
print "Our total university payroll budget is: " + str(Employee.total_salary) 
print "Our average student GPA is: " + str(Student.mean_gpa()) 
+0

Ошибка в настоящее время <функция total_salary в 0x02682670>, но без @staticmethod он дал мне <несвязанный метод Employee.total_salary> –

+1

Вы никогда суммируйте заработную плату в методе total_salaries, вы передаете два параметра, которые не используются, а «total_salary» - это атрибут класса, который также не используется, кроме возвращаемого. Что ты пытаешься сделать? Как вы хотите решить эту проблему? –

+0

Я пытаюсь добавить зарплату сотрудников в People, но также хочу, чтобы они добавляли зарплату, если я добавляю сотрудника –

ответ

2

Ваше основное недоразумение в том, как работают классы. В вашем коде, вы вызываете классы, а не экземпляры классов:

print "Our total university payroll budget is: " + str(Employee.total_salary) 
print "Our average student GPA is: " + str(Student.mean_gpa()) 

Ключевым моментом здесь является:

Employee.total_salary 

Вместо этого вы должны делать что-то вроде этого:

leslie = Professor("Leslie", "985-2363", 50000.00, "Info 501") 
print "Leslie's Salary: " + str(leslie.salary) 

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

def University(): 
    def __init__(self): 
     self.employees[] 

    def add_employee(self, employee): 
     self.employees.append(employee) 

    def get_total_payroll(self): 
     total = 0 
     for employee in self.employees: 
      total += employee.salary 
     return total 

затем использовать экземпляр этого класса:

university = University() 
university.add_employee(Professor("Leslie", "985-2363", 50000.00, "Info 501")) 
university.add_employee(Staff("Alex", "743-4638", 25000.00, "Editor")) 

print "Total payroll: " + str(university.get_total_payroll()) 

Очевидно, что существует гораздо больше корректировки, которые необходимо сделать, как сортировка betweeen сотрудников и студентов и т.д. Но, надеюсь, это достаточно начните.

0

Есть проблемы с вашей общей конструкции, которые были охвачены в других ответов, так что я просто пытаюсь объяснить, почему ваш текущий код не работает:

  1. Вы создали атрибут класса с именем total_salary и затем затеняет его методом с тем же именем.
  2. Вы используете статический метод, когда вам нужно использовать метод класса.
  3. Чтобы вернуть его значение, необходимо позвонить total_salary.

Эти проблемы могут быть решены следующим образом:

class Employee(Person): 
    _total_salary = 0 

    @classmethod 
    def total_salary(cls): 
     return cls._total_salary 
... 

print "Our total university payroll budget is: " + str(Employee.total_salary()) 

Но обратите внимание, что код будет поднимать AttributeError, потому что вы пытаетесь вызвать Student.mean_gpa, который не был определен.

0

Ваш класс Сотрудник имеет атрибут И метод с тем же именем. Вызов Employee.total_salary вернет функцию, потому что в MRO она заменяет атрибут.

Изменение:

class Employee(Person): 
    total_salary = 0 

в

class Employee(Person): 
    total_salary_value = 0 

Ваш staticmethod total_salary в Employee возвращает переменную, которая не существует (потому что он ищет только в рамках метода), вы должны вернуть Работника .total_salary_value.Как так:

@staticmethod 
def total_salary(): 
    return Employee.total_salary_value 

В __init__ из Employee вы не инстанцирования Person, что вы наследующий (то же самое в Student (наследуя Person), Professor и Staff (оба унаследовать Employee)

Используйте либо :

Person.__init__(self,name,phone) 

или

super(Employee, self).__init__(name, phone) 

Еще в инициализации, вы не добавляете зарплату в total_salary_value

добавить следующее:

Employee.total_salary_value += self.salary 

Кроме того, нет необходимости использовать self.name и self.phone в Student, потому что Person уже имеет этот атрибут. (То же самое для этого и других переменных в Professor и Staff)

И, наконец, Student не имеет метод, называемый mean_gpa. Вы должны его реализовать.

Вот код:

class Person(object): 
    def __init__(self, name, phone): 
     self.name = name 
     self.phone = phone 

class Employee(Person): 
    total_salary_value = 0 

    @classmethod 
    def total_salary(cls): 
     return cls.total_salary_value 

    def __init__(self, name, phone, salary): 
     Person.__init__(self,name,phone) 
     self.salary = salary 
     Employee.total_salary_value += self.salary 

class Student(Person): 
    all_gpa = [] 

    def __init__(self, name, phone, gpa): 
     Person.__init__(self,name,phone) 
     self.gpa = gpa 
     Student.all_gpa.append(self.gpa) 

    def __str__(self): 
     return "Person {0} has phone {1} and is a Student with gpa {2}".format(self.name,self.phone,self.gpa) 

    @classmethod 
    def mean_gpa(cls): 
     return sum(cls.all_gpa)/len(cls.all_gpa) 


class Professor(Employee): 
    def __init__(self, name, phone, salary, clas_teach): 
     Employee.__init__(self,name,phone,salary) 
     self.clas_teach = clas_teach 

    def __str__(self): 
     return "Person {0} has phone {1} and is an Employee with salary {2}\n" \ 
       "and is a Professor assigned to class {3}".format(self.name,self.phone,self.salary,self.clas_teach) 


class Staff(Employee): 
    def __init__(self, name, phone, salary, position): 
     Employee.__init__(self, name, phone, salary) 
     self.position = position 

    def __str__(self): 
     return "Person {0} has phone {1} and is an Employee with salary {2}\n" \ 
       "and is Staff with title {3}".format(self.name, self.phone, self.salary, self.position) 

# Create a list of people 
People = [ Student("Sandy", "326-8324", 3.65), 
      Student("Jordan", "632-7434", 3.1), 
      Professor("Leslie", "985-2363", 50000.00, "Info 501"), 
      Staff("Alex", "743-4638", 25000.00, "Editor") ] 

# display information about our people 
print "These are the people in the university:" 
for person in People: 
    print person 

# display the total salaries of all our employees and average GPA 
# of all of our students 
print 
print "Our total university payroll budget is: " + str(Employee.total_salary()) 
print "Our average student GPA is: " + str(Student.mean_gpa()) 

EDIT:

Как @ekhumoro сказал, что лучше использовать @classmethod, чтобы вернуть значение.

Другое дело, ваш __str__ можно было бы сделать более ясным, используя .format()