Python: перезаписать __int__ - PullRequest
       0

Python: перезаписать __int__

0 голосов
/ 05 апреля 2020

Рабочее решение, которое возвращает целые числа, было дано в Overload int () в Python.

Однако оно работает только для возврата int, но не float или скажем список:

class Test:
    def __init__(self, mylist):
        self.mylist = mylist
    def __int__(self):
        return list(map(int, self.mylist))

t = Test([1.5, 6.1])
t.__int__()   # [1, 6]
int(t)

Таким образом t.__int__() работает, но int(t) дает TypeError: __int__ returned non-int (type list).

Таким образом, есть возможность полностью перезаписать int, может быть с __getattribute__ или metaclass?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Специальные методы __int__, __float__, ... и многие другие не перезаписывают их соответствующий тип, например int, float, et c. Эти методы служат перехватчиками, которые позволяют типам запрашивать соответствующее значение. Типы по-прежнему будут принудительно указывать правильный тип.

При необходимости можно на самом деле перезаписать int и аналогичные в модуле builtins. Это может быть сделано где угодно и имеет глобальный эффект.

import builtins

# store the original ``int`` type as a default argument
def weakint(x, base=None, _real_int=builtins.int):
    """A weakly typed ``int`` whose return type may be another type"""
    if base is None:
        try:
            return type(x).__int__(x)
        except AttributeError:
            return _real_int(x)
    return _real_int(x, base)

# overwrite the original ``int`` type with the weaker one
builtins.int = weakint

Обратите внимание, что замена встроенных типов может нарушать предположения кода об этих типах, например, что type(int(x)) is int выполняется. Делайте это только в случае крайней необходимости.

Это пример замены int(...). Это нарушит различные свойства int, являющегося типом, например, проверку наследования, если замена не является тщательно созданным типом. Полная замена требует эмуляции исходного типа int, например, с помощью пользовательских проверок подклассов , и не будет полностью возможной для некоторых встроенных операций.

0 голосов
/ 05 апреля 2020

Из do c из __int__

Вызывается для реализации встроенных функций complex (), int () и float (). Должно возвращать значение соответствующего типа.

Здесь ваш метод возвращает list, а не int, это работает при явном вызове, но не с использованием int(), который проверяет тип то, что возвращается __int__


Вот рабочий пример того, что, если могло бы быть, даже если использование, если не очень уместное

class Test:
    def __init__(self, mylist):
        self.mylist = mylist
    def __int__(self):
        return int(sum(self.mylist))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...