打印出 __str__() 函数以获取列表类型对象的位置

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

当为 Manager() class 打印出 str() 函数时,员工列表打印出对象在内存中的位置,而不是在类型中(海峡)格式。经理的其余部分 str 打印出来很好,但我不知道如何打印员工列表。我现在只是使用 GUI 来测试代码的各个方面。

预先感谢您的宝贵时间。

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()

每当您打印列表时,您将看到这些对象的 __repr__ 而不是 __str__,因此一种方法可能是重写 __repr__ 方法以获得您想要的输出,例如:

def __repr__(self):
    return str(self)

另一种方法是在按如下方式格式化字符串时使用列表推导式:

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)