Как сравнить возврат класса с плавающей точкой или целым числом? - PullRequest
1 голос
/ 27 апреля 2019

Я хочу сравнить __repr__ класса с плавающей точкой или целым числом.

class TestClass:   
    def __init__(self, a = 5): 
        self.a = a     
    def __repr__(self):
        return self.a

Это, очевидно, возвращает ошибку, потому что a не является string:

TypeError: __repr__ returned non-string (type int)

Если я задаю его как строку, печать будет правильной:

>>> TestClass()
5

, но печать не будет сопоставимой:

>>> TestClass() == 5
False

Что я должен использовать для сравнениякласс возвращается, чтобы сделать это TestClass() == 5 в True?

1 Ответ

5 голосов
/ 27 апреля 2019

Ни то, ни другое.

__repr__ вызывается только в тех случаях, когда вам нужна строка и получить объект, , например, из print или в виде одного выражения в командной строке и подразумевается как читаемое человеком представление объекта, из которого (можно надеяться) можно восстановить.

Вспомните, что без перегрузки __repr__ то, что вы получите из командной строкиявляется строкой, обозначающей идентификатор , в отличие от значения объекта, например:

<__main__.TestClass at 0x20feb8836d8>

С другой стороны, что вы делаете сTestClass() == 5 - это значение сравнения.

Следовательно, оно будет оцениваться как True, только если вы определили __eq__, метод равенства:

class TestClass:   
    def __init__(self, a = 5): 
        self.a = a    

    def __eq__(self, other):
        return self.a == other

print(TestClass() == 5)

Выход:

True
...