🖥Задача: Middle



Строки в Питоне сравниваются на основании значений символов. Т.е. если мы захотим выяснить, что больше: «Apple» или «Яблоко», – то «Яблоко» окажется бОльшим.



А все потому, что английская буква «A» имеет значение 65 (берется из таблицы кодировки), а русская буква «Я» – 1071 (с помощью функции ord() это можно выяснить).

Такое положение дел не устроило программиста.



Он считает, что строки нужно сравнивать по количеству входящих в них символов.



Для этого программист создал класс RealString и реализовал озвученный инструментарий. Сравнивать между собой можно как объекты класса, так и обычные строки с экземплярами класса RealString.



К слову, программисту понадобилось только 3 метода внутри класса (включая __init__()) для воплощения задуманного.



В общем случае для создания такого класса понадобится 4 метода, так как в Питоне реализованы «богатые» сравнения. Это значит, что если имеется сравнение «больше», то автоматом появится возможность осуществлять сравнение «меньше».



Решение

class RealString:

def __init__(self, some_str):

self.some_str = str(some_str)



def __eq__(self, other):

if not isinstance(other, RealString):

other = RealString(other)

return len(self.some_str) == len(other.some_str)



def __lt__(self, other):

if not isinstance(other, RealString):

other = RealString(other)

return len(self.some_str) < len(other.some_str)



def __le__(self, other):

return self == other or self < other



Чтобы повторить класс, придуманный программистом (с тремя методами), требуется воспользоваться декоратором @total_ordering из модуля functools (упрощает реализацию сравнений. Требует лишь 2 дополняющих варианта сравнения - например, больше и равно - чтобы автоматически "дописать" остальные).



from functools import total_ordering





@total_ordering

class RealString:

def __init__(self, some_str):

self.some_str = str(some_str)



def __eq__(self, other):

if not isinstance(other, RealString):

other = RealString(other)

return len(self.some_str) == len(other.some_str)



def __lt__(self, other):

if not isinstance(other, RealString):

other = RealString(other)

return len(self.some_str) < len(other.some_str)





# Тесты

str1 = RealString('Молоко')

str2 = RealString('Абрикосы растут')

str3 = 'Золото'

str4 = [1, 2, 3]

print(str1 < str4)

print(str1 >= str2)

print(str1 == str3)




Вывод:



True

False

True




@python_job_interview