Специальные методы __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
, например, с помощью пользовательских проверок подклассов , и не будет полностью возможной для некоторых встроенных операций.