2015-06-21 38 views
4

在Python中,当有对象时,可以使用int函数将其转换为整数。例如int(1.3)将返回1。这可以通过使用对象的__int__魔术方法在内部工作,在这种特殊情况下为float.__int__Fraction对象没有__int__但是int(Fraction(...))仍然有效

在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

我的一位朋友找到了一个指向'__trunc__'何时出现的CPython源的链接。如果您不介意,我会将其编辑为您的答案。 – Ffisegydd

+2

有趣的是,这不是Python文档中的任何地方 - 相反,它的唯一参考是在PEP 3141上:https://www.python.org/dev/peps/pep-3141/ – jsbueno

相关问题