Сравнение объектов в ООП в 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, проверьте
его работу.