Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗pyOpAdOC 28 of 174 menu
◀ ▶

Сравнение объектов в ООП в Python

Сейчас мы научимся сравнивать объекты с помощью операторов == и is.

Для обычного класса без своего метода сравнения оператор == проверяет, указывают ли переменные на один и тот же объект. Результат совпадает с оператором is.

Давайте посмотрим, как это работает на примере. Пусть у нас дан вот такой класс User:

class User: def __init__(self, name, age): self.name = name self.age = age

Создадим два объекта нашего класса с одинаковыми значениями свойств и сравним созданные объекты:

user1 = User('john', 30) user2 = User('john', 30) print(user1 == user2) # выведет False print(user1 is user2) # выведет False

Это разные объекты, хотя данные у них совпадают. Оператор == не сравнивает содержимое свойств по отдельности.

Пусть значения свойств разные:

user1 = User('john', 30) user2 = User('john', 25) print(user1 == user2) # выведет False

Чтобы сравнение через == и is дало True, обе переменные должны указывать на один и тот же объект. Давайте сделаем, чтобы это было так, и сравним переменные:

user1 = User('john', 30) user2 = user1 print(user1 == user2) # выведет True print(user1 is user2) # выведет True

Давайте рассмотрим применение изученной теории. Пусть у нас дан вот такой класс Employee:

class Employee: def __init__(self, name, salary): self.name = name self.salary = salary

Пусть также дан такой класс EmployeesCollection для хранения коллекции работников:

class EmployeesCollection: def __init__(self): self.__employees = [] # список работников # Добавляем нового работника: def add(self, new_employee): self.__employees.append(new_employee) # Получаем всех работников в виде списка: def get(self): return self.__employees

Давайте сделаем так, чтобы работник, который уже есть в нашем наборе, не добавлялся еще раз. Для этого сделаем вспомогательный метод exists, который будет принимать объект с новым работником и проверять его наличие в списке self.__employees:

def __exists(self, new_employee): for employee in self.__employees: if employee == new_employee: # сравниваем через == return True return False

Давайте применим новый метод в нашем классе:

class EmployeesCollection: def __init__(self): self.__employees = [] def add(self, new_employee): # Если такого работника нет - то добавляем: if not self.__exists(new_employee): self.__employees.append(new_employee) def get(self): return self.__employees def __exists(self, new_employee): for employee in self.__employees: if employee == new_employee: return True return False

Давайте проверим работу нашего класса:

employees_collection = EmployeesCollection() employees_collection.add(Employee('john', 100)) employees_collection.add(Employee('john', 100)) # второй такой же добавится print(employees_collection.get()) # убедимся в этом

Сравнение через == не считает равными два разных объекта, даже если у них одинаковые свойства. Поэтому второй работник с теми же данными попадет в коллекцию.

Если же попытаться добавить тот же объект ещё раз, добавления не произойдет:

employees_collection = EmployeesCollection() employee = Employee('john', 100) employees_collection.add(employee) employees_collection.add(employee) # не добавит, тк тот же объект print(employees_collection.get())

Сделайте функцию compare, которая параметром будет принимать два объекта и возвращать True, если у них совпадают все публичные атрибуты и они относятся к одному классу, и False, если это не так.

Сделайте функцию compare, которая параметром будет принимать два объекта и возвращать True, если переданные переменные указывают на один и тот же объект, и False, если на разные.

Сделайте функцию compare, которая параметром будет принимать два объекта и сравнивать их. Функция должна возвращать 1, если переданные переменные указывают на один и тот же объект. Функция должна возвращать 0, если объекты разные, но одного и того же класса и с теми же публичными атрибутами. Функция должна возвращать -1 в противном случае.

Скопируйте мой код класса Employee, затем самостоятельно реализуйте описанный класс EmployeesCollection, проверьте его работу.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить