Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Enum help
#1
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
Reply
#2
please show actual error traceback, complete and unedited using bbcode error tags
Reply
#3
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):
Reply
#4
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
SephMon likes this post
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Variable sorting methods for Enum DataClasses koen 1 779 May-30-2023, 07:31 PM
Last Post: deanhystad
  Alarm system with state, class, enum. Frankduc 0 1,274 May-04-2022, 01:26 PM
Last Post: Frankduc
Question Having trouble writing an Enum with a custom __new__ method stevendaprano 3 4,173 Feb-13-2022, 06:37 AM
Last Post: deanhystad
  enum from typelib Erhy 2 2,164 Jan-26-2019, 05:37 PM
Last Post: Erhy
  Python error? Enum and strings tycarac 3 3,584 Dec-15-2018, 10:39 AM
Last Post: tycarac

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020