2015-06-21 2 views
4

В Python, когда у вас есть объект, вы можете преобразовать его в целое число с помощью функции int.Объект фракции не имеет __int__, но int (Fraction (...)) все еще работает

Например int(1.3) вернет 1. Это работает внутри, используя магический метод объекта __int__, в данном конкретном случае float.__int__.

В Python Fraction объекты могут быть использованы для создания точных фракций.

from fractions import Fraction 
x = Fraction(4, 3) 

Fraction объектов испытывают недостаток в __int__ метод, но вы все еще можете назвать int() на них и получить разумное число обратно. Мне было интересно, как это было возможно без определения метода __int__.

In [38]: x = Fraction(4, 3) 

In [39]: int(x) 
Out[39]: 1 

ответ

8

Метод __trunc__ используется.

>>> class X(object): 
    def __trunc__(self): 
     return 2. 


>>> int(X()) 
2 

__float__ не работает

>>> class X(object): 
    def __float__(self): 
     return 2. 

>>> int(X()) 
Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    int(X()) 
TypeError: int() argument must be a string, a bytes-like object or a number, not 'X' 

The CPython source показывает, когда __trunc__ используется.

+3

Мой друг нашел ссылку на источник CPython, который показывает, когда приходит '__trunc__'. Я собираюсь отредактировать его в вашем ответе, если вы не возражаете. – Ffisegydd

+2

Интересно, что это не где-нибудь в документах Python - вместо этого единственная ссылка на него находится на PEP 3141: https://www.python.org/dev/peps/pep-3141/ – jsbueno

 Смежные вопросы

  • Нет связанных вопросов^_^