Проблема с распечаткой функции __str__() для определения местоположения объекта типа списка

#python #string #function #oop #subclass

#python #строка #функция #ооп #подкласс

Вопрос:

При распечатке функции str() для класса Manager() список сотрудников выводит местоположение объектов в памяти вместо формата type(str). Остальная часть str менеджера печатается нормально, но я не могу понять, как распечатать список сотрудников. На данный момент я просто использую графический интерфейс для тестирования аспектов кода.

Заранее благодарю вас за ваше время.

Изображение неправильного вывода в графическом интерфейсе

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

Комментарии:

1. У вас есть части кода с неправильным отступом. Этот класс IdMaker кажется неправильным ( if isinstance(self.emp_id, object): всегда возвращает True ). На самом деле, что-то не так со всем дизайном.

2. Списки __str__ of (и другие встроенные контейнеры) создаются из __repr__ элементов of, а не их __str__ . Таким образом, одним из решений было бы определить a __repr__ вашего Employee класса — __repr__ = __str__ чуть ниже его определение __str__ будет выполнять эту работу.

3. Извините, я знаю, что значит опытный программист. Я просто работаю над проектом для себя между классами. Спасибо за помощь!

Ответ №1:

Всякий раз, когда вы печатаете список, вы увидите __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)