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