Python позвольте мне переопределить операторы в пользовательских классах.Но могу ли я переопределить, как операторы работают с основными типами данных? - PullRequest
0 голосов
/ 30 декабря 2018

Просто чтобы прояснить, я не могу себе представить, что когда-нибудь захочу это сделать.Но допустим, я хочу изменить работу ==.Не в контексте пользовательского класса, который я делаю, а во всех случаях.Скажем, например, что я хочу переопределить ==, чтобы он игнорировал свои операнды и возвращал True во всех случаях.

Итак,

>>>> 1 == 5
True

>>>> True == False
True

Можно ли это сделать?Мое любопытство не даст мне отдохнуть, пока я не узнаю.Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Наиболее основные типы, такие как int или bool, записываются как типы расширений C, для которых методы не могут быть изменены:

Например, при попытке вычесть целое число +:

>>> int.__add__ = int.__sub__
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    int.__add__ = int.__sub__
TypeError: can't set attributes of built-in/extension type 'int'
0 голосов
/ 30 декабря 2018

Я почти уверен, что вы не можете перегружать операторы встроенных типов.Но я полагаю, что вы можете обернуть его

class MyInt(int):
    def __eq__(self, other):
        return other == 5


if __name__ == '__main__':
    i = MyInt(2)
    print(i == 5)
    i += 5
    print(i == 5)
    print(i)

Класс MyInt будет действовать как обычный int, но его проверка на равенство будет перезаписана и вернет то, что вы когда-либо захотите.Однако, как только вы начнете использовать другие операторы, он вернется к обычному типу int.Вам также придется перезаписать все операторы, убедившись, что вы всегда возвращаете MyInt.

Вывод:

True

False

7

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...