简体   繁体   中英

Python: Class and SubClass - Why won't in recognize the subclass

I am trying to create a class that contains the salary and bonus attributes and another that contains the name and idnum attributes. With a small program that asks if the shift has met goal for the year and then figures the total income for the shift supervisor for the year. Every time I try I get:
File "C:\\Python33\\12-2.py", line 53, in main shift1 = Shiftsupervisor.Employee('28000.0','2240.0','Ian McGregor', 'S10001' ) AttributeError: type object 'Shiftsupervisor' has no attribute 'Employee' What have I done wrong??

# This creates two classes - ShiftSupervisor & Employee
# The program then tells us what the annual income is

# This creates a class of Super Class Shiftsupervisor which contains salary, & bonus \ 
    figures
class Shiftsupervisor:
#Initialize the Shiftsupervisor attributes
    def __init__(self, salary, bonus):
        self.__salary = salary
        self.__bonus = bonus

# creates the mutator for the attributes
    def set_salary(self, salary):
        self.__salary = salary
    def set_bonus(self, bonus):
        self.__bonus = bonus

# returns the attributes
    def get_salary(self):
        return self.__salary
    def get_bonus(self):
        return self.__bonus

#Create the subclass of employee which holds the name & idnum
#Initialize the employee attributes
class Employee(Shiftsupervisor):
    def __init__(self, salary, bonus, name, idnum):
        Shiftsupervisor.__init__(self, salary, bonus)

#Initialize the employee new attributes
        self.__name = name
        self.__idnum = idnum

#creates the new mutator for name & id
    def set_name(self, name):
        self.__name = name
    def set_idnum(self, idnum):
        self.__idnum = idnum

# new method returns the name & id
    def get_name(self):
        return self.__name
    def get_idnum(self):
        return self.__idnum

#This program take info from the two classes and gives
# the total income for the Shift Supervisor

#Creates the shift supervisor objects
def main():
    shift1 = Shiftsupervisor.Employee('28000.0','2240.0','Ian McGregor', 'S10001' )
    shift2 = Shiftsupervisor.Employee('29500','2360.0','Brian Bory', 'S20202' )
    shift3 = Shiftsupervisor.Employee('28750.0','2300.0''Finn McCool', 'S30045' )

def total_income():
    if production == 'y' or 'Y':
        return __salary + __bonus
    else:
        return __salary

#Ask the Question - Did they make production quota
    production = input('Did Shift 1 make quota this year? Type Y for yes ' )
#Print the income
    print(shift1.get_name(),'s Total income is: $', format(total_income, \
        ',.2f'), sep='')

#Ask the Question - Did they make production quota
    production = input('Did Shift 2 make quota this year? Type Y for yes ' )
#Print the income
    print(shift2.get_name(),'s Total income is: $', format(total_income, \
        ',.2f'), sep='')

#Ask the Question - Did they make production quota
    production = input('Did Shift 3 make quota this year? Type Y for yes ' )
#Print the income
    print(super3.get_name(),'s Total income is: $', format(total_income, \
        ',.2f'), sep='')

#call the main function
main()

Your code has the following problems:

  1. I think it'd be better have ShiftSupervisor be a subclass of Employee . Unless I'm misunderstanding, a shift supervisor is a kind of employee, so employee is the base class. A shift supervisor might have additional attributes that specialize the Employee class. I've added the shift_number attribute to demonstrate this.
  2. Your main method only creates the employees, but doesn't ever do anything with them.
  3. Your total_income method is a bit confused. Remember, __salary and __bonus are attributes of an object. You have do always use the form instance.attribute in order to get access to those.
  4. You don't need getters and setters in Python. The convention is to keep them normal fields that are meant to be publicly accessible, and use properties if it turns out you do need more complex accessing logic.
  5. The salary and bonus shouldn't be a string -- they're numeric values.

Taken together, your new code might look something like this:

class Employee:
    def __init__(self, salary, bonus, name, idnum):
        self.salary = salary
        self.bonus = bonus
        self.name = name
        self.idnum = idnum

class ShiftSupervisor(Employee):
    def __init__(self, salary, bonus, name, idnum, shift_number):
        super().__init__(salary, bonus, name, idnum)
        self.shift_number = shift_number


def main():
    shift1 = ShiftSupervisor(28000.0, 2240.0, 'Ian McGregor', 'S10001', 1)
    shift2 = ShiftSupervisor(29500, 2360.0, 'Brian Bory', 'S20202', 2)
    shift3 = ShiftSupervisor(28750.0, 2300.0, 'Finn McCool', 'S30045', 3)

    find_income(shift1)
    find_income(shift2)
    find_income(shift3)

def find_income(employee):
    production = input('Did shift {0} make quota this year? Type Y for yes '.format(employee.shift_number))
    if production.lower() == 'y':
        total_income = employee.salary + employee.bonus
    else:
        total_income = employee.salary
    print("{0}'s Total income is: ${1}".format(employee.name, total_income))

main()

I'm also getting the feeling that you're entangling a shift and an employee in some way that you shouldn't be, though I'm quite able to put my finger on it. A shift might have more than one employee, and an employee could work multiple shifts, though this'll definitely depend based on what problem you're trying to solve.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM