简体   繁体   English

打印出 __str__() function 以获取列表类型 object 的位置

[英]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.当为 Manager() class 打印str () function 时,员工列表以 memory 而不是 type(str) 格式打印出对象的位置。 The rest of the Manager str prints out fine, but I can't figure out how to get the employees list to print out. Manager str的 rest 打印得很好,但我不知道如何打印员工列表。 I'm just using the GUI to test aspects of the code for now.我现在只是使用 GUI 来测试代码的各个方面。

Thank you in advance for your time.提前感谢您的宝贵时间。

Image of incorrect output on GUI GUI 上不正确的 output 图像

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:每当您打印列表时,您将看到这些对象的__repr__而不是__str__ ,因此一种方法可能是覆盖__repr__方法以获得所需的 output,例如:

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)  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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