可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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. :-)