LINUX.ORG.RU

[Python]Как модифицировать int

 


0

1

Приветствую!

Для ответа на первоапрельскую шутку (не)друга, хочу модифицировать встроенный класс(int).

Возможно ли в Питоне, без перекомпеляции исходников заменить страндартный int на такой класс:

class StrangeInt(int):
    def __init__(self, x):
        self.normalInt=x
    def __add__(self, x):
        return self.normalInt-x
    def __sub__(self, x):
        return self.normalInt+x
    def __mul__(self, x):
        return self.normalInt/x
    def __div__(self, x):
        return self.normalInt*x

и сделать прелоад к интерпретатору, чтобы он все int-ы заменял на этот класс StrangeInt

Заранее благодарен

или возможно есть способ лучше реализовать то, что я хочу.

In [1]: x=StrangeInt(55)

In [2]: x+10
Out[2]: 45

In [3]: x-10
Out[3]: 65

In [4]: x*2
Out[4]: 27

In [5]: x/5
Out[5]: 275
Donnie_Darko
() автор топика

Можно попробовать поменять int в __builtins__ на свой. Но при парсинге все останется как есть скорей всего, и в любом случае при такой замене посыпется много чего остального - не потому что операторы заменены а потому что где то как то предполагается что int это нормальный int. И перегрузкой 4х операторов не обойдетесь, там много всего перегружать придется.

AIv ★★★★★
()
Ответ на: комментарий от tailgunner

Приношу свои извинения. Дело было ночью, спать хотелось очень.

Donnie_Darko
() автор топика
Ответ на: комментарий от Donnie_Darko

Более того, там можно вообще переопределить или удалить из класса любые методы (кроме нескольких системных, без которых класс станет неработоспособен). Скажем, добавить ведение лога во все методы класса или реализовать аналог монады Maybe: в выражении obj.maybe.bla1.bla2.bla3.from_maybe цепочка методов bla1.bla2.bla3 будет выполняться только если obj != nil, в ином случае, результат выражения просто будет nil.

geekless ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.