Posts: 12
Threads: 6
Joined: Aug 2020
How can I pass an Enum into a constructor of a class? so the children classes can use it as well
class Employee(ABC5):
employee_id = itertools.count(1000)
def __init__(self,first_name,last_name,id_number,hours_worked,total_wage = 0,Position position):
self.set_first_name(first_name)
self.set_last_name(last_name)
self.id_number = next(self.employee_id)
self.set_hours_worked(hours_worked)
self.total_wage = self.calculate_pay()
self.position = self.position
@abstractmethod
def calculate_pay(self):
pass
def __str__(self):
return '\nName: {} \nLastName: {} \nId Number: {} \nHours Worked: {} \nTotal Pay: {} \nPosition: {}'.format(self.first_name,
self.last_name,self.id_number,self.hours_worked,self.calculate_pay(),self.position)
class Operator(Employee):
amount_per_hour = 9.80
def __init__(self,first_name,last_name,id_number,hours_worked,total_wage = 0):
super().__init__(first_name,last_name,id_number,hours_worked,total_wage = 0)
def calculate_pay(self):
return round(self.amount_per_hour * self.hours_worked)
def __str__(self):
return super(Operator,self).__str__()
class Position(enum.Enum):
OPERATOR = "operator"
SUPERVISOR = "supervisor"
MANAGER = "manager"
I get an error message saying "Position is not accessed"
Thanks
Posts: 12,027
Threads: 485
Joined: Sep 2016
please show actual error traceback, complete and unedited using bbcode error tags
Posts: 12
Threads: 6
Joined: Aug 2020
Thanks for replying
from abc import ABC,abstractmethod
import itertools
from enum import Enum, auto
class Employee(ABC):
employee_id = itertools.count(1000)
def __init__(self,first_name,last_name,id_number,hours_worked,total_wage = 0,Position position):
self.set_first_name(first_name)
self.set_last_name(last_name)
self.id_number = next(self.employee_id)
self.set_hours_worked(hours_worked)
self.total_wage = self.calculate_pay()
def get_first_name(self):
return self.first_name
def get_last_name(self):
return self.last_name
def get_id_number(self):
return self.id_number
def get_hours_worked(self):
return self.hours_worked
def set_first_name(self,first_name):
if not first_name:
raise Exception("FIRSTNAME FIELD CANNOT BE EMPTY!")
self.first_name = first_name
def set_last_name(self,last_name):
if not last_name:
raise Exception("LAST NAME FIELD CANNOT BE EMPTY!")
self.last_name = last_name
def set_id_number(self,id_number):
self.id_number = id_number
def set_hours_worked(self,hours_worked):
if hours_worked < 0:
raise Exception("HOURS CANNOT BE LESS THAN 0!")
self.hours_worked = hours_worked
@abstractmethod
def calculate_pay(self):
pass
def __str__(self):
return '\nName: {} \nLastName: {} \nId Number: {} \nHours Worked: {} \nTotal Pay: {} \nPosition: {}'.format(self.first_name, self.last_name,self.id_number,self.hours_worked,self.calculate_pay(),self.position)
class Operator(Employee):
amount_per_hour = 9.80
def __init__(self,first_name,last_name,id_number,hours_worked,total_wage = 0,position):
super().__init__(first_name,last_name,id_number,hours_worked,total_wage = 0,position)
def calculate_pay(self):
return round(self.amount_per_hour * self.hours_worked)
def __str__(self):
return super(Operator,self).__str__()
class Supervisor(Employee):
amount_per_hour = 12.10
def __init__(self,first_name,last_name,id_number,hours_worked,total_wage = 0,position):
super().__init__(first_name,last_name,id_number,hours_worked,total_wage = 0,position)
def calculate_pay(self):
return round(self.amount_per_hour * self.hours_worked)
def __str__(self):
return super(Supervisor,self).__str__()
class Manager(Employee):
def __init__(self,first_name,last_name,id_number,hours_worked,total_wage = 0,position):
super().__init__(first_name,last_name,id_number,hours_worked,total_wage = 0,position)
def calculate_pay(self):
return 4000
def __str__(self):
return super(Manager,self).__str__()
class Position(Enum):
OPERATOR = "operator"
SUPERVISOR = "supervisor"
MANAGER = "manager"
def main():
o = Operator("Kevin","ward",0,39,0,Position.SUPERVISOR)
print(o)
main() Error: Traceback (most recent call last):
File "C:\Users\Sephiroth\Desktop\thonny\Employee3.py", line 11
def __init__(self,first_name,last_name,id_number,hours_worked,total_wage = 0,Position position):
Posts: 2,168
Threads: 35
Joined: Sep 2016
Nov-19-2021, 09:39 AM
(This post was last modified: Nov-19-2021, 09:39 AM by Yoriz.)
In the line
def __init__(self,first_name,last_name,id_number,hours_worked,total_wage = 0,Position position): id_number is not used
- A non-default argument follows default argument
total_wage is not used
Position position is invalid syntax
In the line
o = Operator("Kevin","ward",0,39,0,Position.SUPERVISOR) If they are an Operator why are you passing the enum SUPERVISOR ?
It's already known what position they are in as there is a class of the same name.
Operator and Supervisor have the same method calculate_pay so it may as well go in the base class.
The methods def __str__(self): are not required in the sub classes as they don't alter anything.
At the moment it Is looking like you might not even need to use subclassing.
raise Exception("FIRSTNAME FIELD CANNOT BE EMPTY!") Raising the base Exception is not very useful, raise a more specific exception or make your own exception.
amount_per_hour will change over time so it probably shouldn't be a default value
The following makes your code work
from abc import ABC
import itertools
from enum import Enum
class Employee(ABC):
employee_id = itertools.count(1000)
def __init__(
self, first_name, last_name, hours_worked, position, amount_per_hour=0
):
self.set_first_name(first_name)
self.set_last_name(last_name)
self.id_number = next(self.employee_id)
self.set_hours_worked(hours_worked)
self.amount_per_hour = amount_per_hour
self.total_wage = self.calculate_pay()
self.position = position
def get_first_name(self):
return self.first_name
def get_last_name(self):
return self.last_name
def get_id_number(self):
return self.id_number
def get_hours_worked(self):
return self.hours_worked
def set_first_name(self, first_name):
if not first_name:
raise Exception("FIRSTNAME FIELD CANNOT BE EMPTY!")
self.first_name = first_name
def set_last_name(self, last_name):
if not last_name:
raise Exception("LAST NAME FIELD CANNOT BE EMPTY!")
self.last_name = last_name
def set_id_number(self, id_number):
self.id_number = id_number
def set_hours_worked(self, hours_worked):
if hours_worked < 0:
raise Exception("HOURS CANNOT BE LESS THAN 0!")
self.hours_worked = hours_worked
def calculate_pay(self):
return round(self.amount_per_hour * self.hours_worked)
def __str__(self):
return (
f"\nName: {self.first_name} \nLastName: {self.last_name} \n"
f"Id Number: {self.id_number} \nHours Worked: {self.hours_worked} \n"
f"Total Pay: {self.calculate_pay()} \nPosition: {self.position}"
)
class Operator(Employee):
def __init__(self, first_name, last_name, hours_worked, amount_per_hour=9.80):
super().__init__(
first_name, last_name, hours_worked, Position.OPERATOR, amount_per_hour
)
class Supervisor(Employee):
def __init__(self, first_name, last_name, hours_worked, amount_per_hour=12.10):
super().__init__(
first_name, last_name, hours_worked, Position.SUPERVISOR, amount_per_hour
)
class Manager(Employee):
def __init__(self, first_name, last_name, hours_worked):
super().__init__(first_name, last_name, hours_worked, Position.MANAGER)
def calculate_pay(self):
return 4000
class Position(Enum):
OPERATOR = "operator"
SUPERVISOR = "supervisor"
MANAGER = "manager"
def main():
operator = Operator("Kevin", "ward", 39)
print(operator)
supervisor = Supervisor("Bob", "Jobs", 10)
print(supervisor)
manager = Manager("Almighty", "Dictator", 1)
print(manager)
if __name__ == "__main__":
main() Output: Name: Kevin
LastName: ward
Id Number: 1000
Hours Worked: 39
Total Pay: 382
Position: Position.OPERATOR
Name: Bob
LastName: Jobs
Id Number: 1001
Hours Worked: 10
Total Pay: 121
Position: Position.SUPERVISOR
Name: Almighty
LastName: Dictator
Id Number: 1002
Hours Worked: 1
Total Pay: 4000
Position: Position.MANAGER
|