Using inheritance in python

2020-02-29 05:39发布

问题:

this is my homework assignment, I saw it posted on the website before, but it looks like it was unsolved and I got a different error message than a person asking that question before.

the first part of the problem is to define the subclass Worker that inherits from Employee and includes an attribute that refers to another employee who is the worker's manager. You should define a method get_manager that returns the workers' manager.

Example:

worker = Worker("Fred", 52000, myboss)

The second part of the problem is to define the subclass Executive that inherits from Employee and includes an attribute that refers to the yearly bonus.

You should override the wage method to compute executive pay based on his/her salary and bonus. You should use the wage method of Employee in the definition of the wage method for the Executive class.

Example:

executive = Executive("Kerry", 520000, 1040000)

My code is written below and the error message I get is: 'global name 'salary' is not defined' in the line 'Employee.init(self, name, salary) ' for class Executive (It works for Worker class). Why do I get that error and how can I fix it?

Thank you for your help!

class Employee(object):
    def __init__(self, name, salary):
        self._name = name
        self._salary = salary

    def my_name(self):
        return self._name

    def wage(self):
        return self._salary/26   # fortnight pay

class Worker(Employee):
    def __init__(self, name, salary, manager):
        Employee.__init__(self, name, salary)
        self._manager = manager

    def getManager(self):
        return self._manager

class Executive(Employee):
    def __init__(self, name, wage, yearlyBonus):
        Employee.__init__(self, name, salary) 
        self._yearlyBonus = yearlyBonus

    def wage(self):
        return Employee.wage(self)

回答1:

The error is pretty clear. salary is not defined in the __init__ method of Executive.

You used wage as an argument to __init__, but salary when calling __init__ of your parent class, so you should stick to one variable name:

class Executive(Employee):
    def __init__(self, name, salary, yearlyBonus):
        Employee.__init__(self, name, salary) 

Also, you can get around typing all of those parameters in each time by using *args:

class Executive(Employee):
    def __init__(self, *args, yearlyBonus):
        super(Executive, self).__init__(*args)

Use super() instead of calling the parent class's __init__ method. It makes multiple inheritance a bit easier.



回答2:

Just look at the code where the error is occurring, and keep looking until you notice what doesn't match up:

def __init__(self, name, wage, yearlyBonus):
    Employee.__init__(self, name, salary) 


回答3:

Yes, your init function does not have variable named salary, which gives error when you passed it in to Employee.init.

class Executive(Employee):
    def __init__(self, name, wage, yearlyBonus):
        Employee.__init__(self, name, salary) 

when you do this

executive = Executive("Kerry", 520000, 1040000)

which one correlates to the salary? passed that as the employee init method. Better if you call the Employee constructor with super

Guessing from this method

def wage(self):
        return self._salary/26   

Maybe this is what you want (not sure how to account yearlyBonus though)

 class Executive(Employee):
        def __init__(self, name, wage, yearlyBonus):
            Employee.__init__(self, name, wage * 26) 


回答4:

Look at the declaration of Executive.__init__:

def __init__(self, name, wage, yearlyBonus):

Nowhere in there does it declare a variable named salary. But when you call the superclass constructor,

    Employee.__init__(self, name, salary) 

you are asking Python to pass the value of a variable named salary as the third parameter. Python is just complaining that this variable does not exist.

I imagine you can figure out how to fix it from there. :-)