Python: как добавить информацию в словарь с помощью класса, а затем распечатать ключ и значения добавленной записи словаря

Я работаю над следующим заданием и впервые использую классы для создания / хранения объектов:

Система управления сотрудниками: в этом упражнении предполагается, что вы создали класс «Сотрудник» для упражнения 4 по программированию. Создайте программу, которая хранит объекты «Сотрудник» в словаре. Используйте идентификационный номер сотрудника в качестве ключа. Программа должна иметь меню, которое позволяет пользователю выполнять следующие действия: искать сотрудника в словаре, добавлять нового сотрудника в словарь, изменять имя существующего сотрудника, отдел и название должности в словаре, удалять сотрудника из словарь, выйдите из программы. Когда программа завершится, она должна обработать словарь и сохранить его в файл. Каждый раз, когда программа запускается, она должна пытаться загрузить из файла маринованный словарь. Если файл не существует, программа должна начинаться с пустым словарем.

Все шло гладко, пока я не запустил программу и не смог правильно распечатать информацию при использовании функции поиска сотрудников. При запуске кода:

if ID in dictionary.keys():
    print(ID, ': ', dictionary[ID])

Результат:

1 :  <Employee.Employee object at 0x03520340>

Я прикрепил изображение программы, запущенной, когда я добавляю сотрудника, а затем пытаюсь найти его. Я думаю, что может быть проблема с тем, как я сохранил данные в первую очередь в функции добавления, или проблема с доступом к данным в функции поиска. Есть ли другой способ распечатать содержимое словаря для указанного идентификатора? Во-первых, я неправильно сохранил свойства объекта?


Для справки вот остальная часть моего кода:

Employee.py (класс сотрудника в отдельном файле):

class Employee:
    # Initialize Employee object
    def __init__(self, ID, name, department, job):
        self.__name = name
        self.__ID = ID
        self.__department = department
        self.__job = job

    # Set each object
    def set_name(self, name):
        self.__name = name

    def set_ID(self, ID):
        self.__ID = ID

    def set_dept(self, department):
        self.__department = department

    def set_job(self, job):
        self.__job = job

    # Get each object
    def get_name(self):
        return self.name

    def get_ID(self):
        return self.__ID

    def get_department(self):
        return self.__department

    def get_job(self):
        return self.__job


    def print(self):
        print("Name: " + self.__name + \
               ", ID Number: " + self.__ID + \
               ", Department: " + self.__department + \
               ", Job Title: " + self.__job)

EmployeeManagementSystem.py:

# Import necessary libraries
import pickle
import Employee
    
    
# STEP 1 = DEFINE FUNCTIONS FOR EACH CHOICE

# Lookup an employee
def lookup(dictionary):
    # Look up the ID number if it is in the dictionary
    ID = int(input('Enter the employee ID number: '))
    if ID in dictionary.keys():
        print(ID, ': ', dictionary[ID])
        print(dictionary.get(ID)) 
    else:
    print("That ID number was not found.")

    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed


# Add an employee
def add(dictionary):
    # Add a new employee
    ID = int(input('Enter the employee ID number: '))
    name = input('Enter the name of the employee: ')
    dept = input('Enter the employee department: ')
    job = input('Enter the employee job title: ')
  
    entry = Employee.Employee(ID, name, dept, job)
    dictionary[ID] = entry
    print('Employee added succesfully')
   
    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed
    
    
# Change an employee    
def change(dictionary):
    # If user-entered ID is in dictionary, allow them to change the info
    ID = input('Enter the employee ID you would like to change: ')
    if ID in dictionary.keys():
        name = input('Enter new employee name: ')
        newId = input('Enter new employee ID: ')
        dept = input('Enter new employee department: ')
        job = input('Enter new employee job title: ')
        entry = Employee.Employee(newID, name, dept, job)
        dictionary[ID] = entry
        print('Employee changed successfully.')
    else:
        print('That employee ID was not found.')
    
    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed
    
    
# Delete an employee
def delete(dictionary):
    # If user-entered ID is in dictionary, delete the entry
    ID = input('Enter the employee ID you would like to remove: ')
    if ID in dictionary.keys():
        del dictionary[ID]
        print('Employee removed successfully')
    else:
        print('That employe ID was not found.')
 
    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed
    
    
# Save the dictionary and quit the program
def save_quit(dictionary):
    # Pickle the dictionary and save to a file
    output_file = open('employee_data.dat','wb')
    pickle.dump(dictionary,output_file)
    output_file.close
    
        
    # End the while loop in main() so program quits
    proceed = False
    return proceed
# STEP 2 - Main Function
def main():

    # Try to open the existing dictionary file
    try:
        input_file = open('employee_data.dat','rb')
        employee_dictionary = pickle.load(input_file)
        input_file.close()

    # If no such file exists, create a new dictionary
    except:
        employee_dictionary = {}


    # While loop to continue until user chooses to quit
    proceed = True
    while proceed:

        # Display user's option menu and ask for a choice
        print('\n Employee Management System\n')
        print('\t1. Lookup an employee')
        print('\t2. Add a new employee')
        print('\t3. Change an existing employee')
        print('\t4. Delete an existing employee')
        print('\t5. Save and Quit\n')

        option_choice = int(input('Enter an option to continue: '))

        # Map each choice to the functions below using a dictionary
        options = {1:lookup, 2:add, 3:change, 4:delete, 5:save_quit,}
        proceed = options[option_choice](employee_dictionary)



# STEP 3 - CALL MAIN
# Call the main function
main()

person larbot    schedule 18.11.2020    source источник
comment
Вы должны добавить __str__() метод сотруднику, чтобы сообщить python, как его распечатать. Python не знает, как печатать собственные классы.   -  person mousetail    schedule 18.11.2020
comment
Я изменил метод печати, который у меня был раньше, на __str __ () с помощью оператора return, но теперь я получаю «Ошибка типа: могу только объединить str (не int) с str». Нужно ли мне преобразовывать идентификатор сотрудника в строку для печати? Не знаю, как это сделать в классе.   -  person larbot    schedule 18.11.2020
comment
Да, вы можете использовать str(x), чтобы превратить x в строку.   -  person mousetail    schedule 18.11.2020
comment
Исправлена ​​часть str, но когда я печатаю что-либо из словаря, он по-прежнему показывает ‹объект Employee.Employee по адресу 0x03484D90› вместо информации   -  person larbot    schedule 18.11.2020


Ответы (2)


def lookup(dictionary):
    # Look up the ID number if it is in the dictionary
    ID = int(input('Enter the employee ID number: '))
    if ID in dictionary.keys():
        x=dictionary.get(ID)
        x.print()

    else:
        print("That ID number was not found.")

    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed

Поскольку у вас уже есть функция для вызова печати, и в функции печати есть ошибка для исправления, которая меняет 'self .__ id' на 'str (self .__ ID)'

    def print(self):
        print("Name: " + self.__name + \
               ", ID Number: " + str(self.__ID) + \
               ", Department: " + self.__department + \
               ", Job Title: " + self.__job)
person Aditya Gupta    schedule 18.11.2020

Вы можете изменить метод print в своем классе Employee на __str__ следующим образом:

class Employee:
    # Initialize Employee object
    def __init__(self, ID, name, department, job):
        self.__name = name
        self.__ID = ID
        self.__department = department
        self.__job = job

    # Set each object
    def set_name(self, name):
        self.__name = name

    def set_ID(self, ID):
        self.__ID = ID

    def set_dept(self, department):
        self.__department = department

    def set_job(self, job):
        self.__job = job

    # Get each object
    def get_name(self):
        return self.name

    def get_ID(self):
        return self.__ID

    def get_department(self):
        return self.__department

    def get_job(self):
        return self.__job

    def __str__(self):
        return (f"Name: {self.__name}, ID Number: {self.__ID}, "
                f"Department: {self.__department}, Job Title: {self.__job}")

А также исправьте несколько мелких опечаток в вашем EmployeeManagementSystem.py файле:

# Import necessary libraries
import pickle
import Employee


def get_int_input(prompt):
    num = -1
    while True:
        try:
            num = int(input(prompt))
            break
        except:
            print("Error: Enter an integer, try again...")
    return num


# Lookup an employee
def lookup(dictionary):
    # Look up the ID number if it is in the dictionary
    employee_id = get_int_input('Enter the employee ID number: ')
    if employee_id in dictionary:
        # print('employee_id', ': ', dictionary[employee_id])
        print(dictionary.get(employee_id))
    else:
        print("That ID number was not found.")

    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed


# Add an employee
def add(dictionary):
    # Add a new employee
    empyloyee_id = get_int_input('Enter the employee ID number: ')
    name = input('Enter the name of the employee: ')
    dept = input('Enter the employee department: ')
    job = input('Enter the employee job title: ')

    entry = Employee.Employee(empyloyee_id, name, dept, job)
    dictionary[empyloyee_id] = entry
    print('Employee added succesfully')

    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed


# Change an employee
def change(dictionary):
    # If user-entered ID is in dictionary, allow them to change the info
    employee_id = get_int_input(
        'Enter the employee ID you would like to change: ')
    if employee_id in dictionary.keys():
        name = input('Enter new employee name: ')
        dept = input('Enter new employee department: ')
        job = input('Enter new employee job title: ')
        entry = Employee.Employee(employee_id, name, dept, job)
        dictionary[employee_id] = entry
        print('Employee changed successfully.')
    else:
        print('That employee ID was not found.')

    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed


# Delete an employee
def delete(dictionary):
    # If user-entered ID is in dictionary, delete the entry
    employee_id = get_int_input(
        'Enter the employee ID you would like to remove: ')
    if employee_id in dictionary.keys():
        del dictionary[employee_id]
        print('Employee removed successfully')
    else:
        print('That employee ID was not found.')

    # Offer the user the menu of choices again from main()
    proceed = True
    return proceed


# Save the dictionary and quit the program
def save_quit(dictionary):
    # Pickle the dictionary and save to a file
    output_file = open('employee_data.dat', 'wb')
    pickle.dump(dictionary, output_file)
    output_file.close

    # End the while loop in main() so program quits
    proceed = False
    return proceed


# STEP 2 - Main Function
def main():
    # Try to open the existing dictionary file
    try:
        input_file = open('employee_data.dat', 'rb')
        employee_dictionary = pickle.load(input_file)
        input_file.close()

    # If no such file exists, create a new dictionary
    except:
        employee_dictionary = {}

    # While loop to continue until user chooses to quit
    proceed = True
    while proceed:

        # Display user's option menu and ask for a choice
        print('\n Employee Management System\n')
        print('\t1. Lookup an employee')
        print('\t2. Add a new employee')
        print('\t3. Change an existing employee')
        print('\t4. Delete an existing employee')
        print('\t5. Save and Quit\n')

        option_choice = get_int_input('Enter an option to continue: ')

        # Map each choice to the functions below using a dictionary
        options = {
            1: lookup,
            2: add,
            3: change,
            4: delete,
            5: save_quit,
        }
        proceed = options[option_choice](employee_dictionary)


# STEP 3 - CALL MAIN
# Call the main function
main()

Пример использования:

 Employee Management System

    1. Lookup an employee
    2. Add a new employee
    3. Change an existing employee
    4. Delete an existing employee
    5. Save and Quit

Enter an option to continue: 2
Enter the employee ID number: 123
Enter the name of the employee: asd
Enter the employee department: asd
Enter the employee job title: asd
Employee added succesfully

 Employee Management System

    1. Lookup an employee
    2. Add a new employee
    3. Change an existing employee
    4. Delete an existing employee
    5. Save and Quit

Enter an option to continue: 1
Enter the employee ID number: 123
Name: asd, ID Number: 123, Department: asd, Job Title: asd

 Employee Management System

    1. Lookup an employee
    2. Add a new employee
    3. Change an existing employee
    4. Delete an existing employee
    5. Save and Quit

Enter an option to continue: 3
Enter the employee ID you would like to change: asd
Error: Enter an integer, try again...
Enter the employee ID you would like to change: 123
Enter new employee name: zxc
Enter new employee department: zxc
Enter new employee job title: zxc
Employee changed successfully.

 Employee Management System

    1. Lookup an employee
    2. Add a new employee
    3. Change an existing employee
    4. Delete an existing employee
    5. Save and Quit

Enter an option to continue: 1
Enter the employee ID number: 123
Name: zxc, ID Number: 123, Department: zxc, Job Title: zxc

 Employee Management System

    1. Lookup an employee
    2. Add a new employee
    3. Change an existing employee
    4. Delete an existing employee
    5. Save and Quit

Enter an option to continue: 4
Enter the employee ID you would like to remove: 123
Employee removed successfully

 Employee Management System

    1. Lookup an employee
    2. Add a new employee
    3. Change an existing employee
    4. Delete an existing employee
    5. Save and Quit

Enter an option to continue: 1
Enter the employee ID number: 123
That ID number was not found.

 Employee Management System

    1. Lookup an employee
    2. Add a new employee
    3. Change an existing employee
    4. Delete an existing employee
    5. Save and Quit

Enter an option to continue: 5
person Sash Sinha    schedule 18.11.2020