简体   繁体   中英

Issue printing out __str__() function for location of a list type object

When printing out the str () function for the Manager() class the employees list prints out the location of the objects in memory instead of in type(str) format. The rest of the Manager str prints out fine, but I can't figure out how to get the employees list to print out. I'm just using the GUI to test aspects of the code for now.

Thank you in advance for your time.

Image of incorrect output on GUI

import random
from random import randint
from tkinter import *
import tkinter as tk
from tkinter import ttk


class Employees(object):
'''
'''
    num_emps = 0

    def __init__(self, first_name, last_name, pay, emp_id):
        self.first_name = first_name
        self.last_name = last_name

        self.pay = pay
        self.emp_id = self.IdMaker()
        Employees.num_emps += 1

    
    def get_first_name(self):                                                  #Retrieves First Name 
        return self.first_name
    def get_last_name(self):                                                   #Retrieves Last Name 
        return self.last_name
    def get_full_name(self):                                                   #Retrieves Full Name 
        return '{} {}'.format(self.first_name, self.last_name)
    def __str__(self):
        return '{self.emp_id}: {self.first_name} {self.last_name}'.format(self=self)
        #####---ID CLASS---#####
        class IdMaker():
        '''
        '''
        def __init__(self):
            self.emp_id = 'emp_' + ''.join(str(random.randint(0, 9)) for x in range(12))
            self.food_id = 'food_' + ''.join(str(random.randint(0, 9)) for x in range(12))
            self.sanitation_id = 'sani_' + ''.join(str(random.randint(0, 9)) for x in range(12)) 
            self.dinnerWare_id = 'dWare_' + ''.join(str(random.randint(0, 9)) for x in range(12))
        
        def __str__(self):
            if isinstance(self.emp_id, object):
                return '{self.emp_id}'.format(self=self)
            elif isinstance(self.food_id, object):
                return 'food_{self.food_id}'.format(self=self)
            elif isinstance(self.sanitation_id, object):
                return 'sani_{self.sanitation_id}'.format(self=self)
            elif isinstance(self.dinnerWare_id, object):
                return 'sani_{self.dinnerWare_id}'.format(self=self)
            else:
                print('No such object')
#-----------------------------------------------------------------------------


class Manager(Employees):
    def __init__(self, first_name, last_name, pay, emp_id, employees=None):
        super().__init__(first_name, last_name, pay, emp_id)
    
        # if schedule is None:                                  #Schedule
        #     self.schedule = {}
        # else:
        #     self.schedule = schedule
        
        if employees is None:                                   #Employees working for Manager
            self.employees = []
        else:
            self.employees = employees
    def add_emp(self, emp):
        if emp not in self.employees:
            self.employees.append(emp)
    def remove_emp(self, emp):
        if emp in self.employees:
            self.employees.remove(emp)
    def print_emps(self):
        for emp in self.employees:
            print(emp.get_full_name())
    def __str__(self):
        return '{self.emp_id}: {self.first_name} {self.last_name} |Pay - ${self.pay} - {self.employees}'.format(self=self)  

   
class FOH(Manager):
    def __init__(self, first_name, last_name, pay, emp_id):
        Employees.__init__(self, first_name, last_name, pay, emp_id)
        self.pay = pay
        # if schedule is None:                                                   #Schedule 
        #     self.schedule = {}
        # else:
        #     self.schedule = schedule
    def __str__(self):
        return '{self.emp_id}: {self.first_name} {self.last_name} |Pay - ${self.pay}'.format(self=self)


class BOH(Manager):
    def __init__(self, first_name, last_name, pay, emp_id):
        Employees.__init__(self, first_name, last_name, pay, emp_id)
        self.pay = pay
        # if schedule is None:                                                   #Schedule 
        #     self.schedule = {}
        # else:
        #     self.schedule = schedule
    def __str__(self):
        return '{self.emp_id}: {self.first_name} {self.last_name} |Pay - ${self.pay}'.format(self=self)


foh_1 = FOH('Rebecca', 'Peters', 60000, None)
foh_2 = FOH('Becca', 'Peters', 60000, None)
boh_3 = BOH('Beckles', 'Peters', 60000, None)
mgr_1 = Manager('Sean', 'Sheaffer', 90000, None, [foh_1, foh_2, boh_3])
# mgr_1.add_emp([foh_2])
# mgr_1.add_emp([boh_3])
mgr_2 = Manager('Becky', 'Peters', 100000, None, [boh_3])

mgr_2.print_emps()
mgr_1.print_emps() 


#####---GUI CLASS---#####
root = Tk()
root.title('DigiSous')
root.geometry("600x200")
# Creates tab control
tabControl = ttk.Notebook(root)
class GUI(Manager):
    def __init__(self, master, first_name, last_name, pay, emp_id):
        super().__init__(first_name, last_name, pay, emp_id)

        my_frame = Frame(master)
        my_frame.pack()
    
        #Find Employees working for Manager
        self.find_mgr_emps = Button(master, text="Employees", command=self.manager_emps)
        self.find_mgr_emps.pack(pady=20)
    
        self.find_mgr_emps_Entry = Entry(master, width=90, borderwidth=5)
        self.find_mgr_emps_Entry.pack(pady=10)

    def manager_emps(self):
        self.find_mgr_emps_Entry.delete(0, END)
        mgr_emps = mgr_1
        self.find_mgr_emps_Entry.insert(0, mgr_emps)
   
#-----------------------------------------------------------------------------

e = GUI(root, None, None, None, None)
root.mainloop()

Whenever you print a list, you will see the __repr__ of those objects instead of __str__ , so one way could be to override the __repr__ method to get your desired output, as for example:

def __repr__(self):
    return str(self)

Another way could be to use a list comprehension when you format your string as follows:

class Manager(Employees):
    def __str__(self):
      return '{self.emp_id}: {self.first_name} {self.last_name} |Pay - ${self.pay} - {[str(x) for x in self.employees]}'.format(self=self)  

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