分数对象没有__int__但int(分数(...))仍然有效

Ffi*_*ydd 4 python int fractions python-internals

在Python中,当您有一个对象时,可以使用该int函数将其转换为整数.

例如int(1.3)将返回1.__int__在这种特殊情况下,这通过使用对象的魔术方法在内部工作float.__int__.

在Python中,Fraction对象可用于构造精确的分数.

from fractions import Fraction
x = Fraction(4, 3)
Run Code Online (Sandbox Code Playgroud)

Fraction对象缺少一个__int__方法,但你仍然可以调用int()它们并获得一个合理的整数.我想知道如何在没有__int__定义方法的情况下实现这一点.

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

In [39]: int(x)
Out[39]: 1
Run Code Online (Sandbox Code Playgroud)

Use*_*ser 8

使用该__trunc__方法.

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


>>> int(X())
2
Run Code Online (Sandbox Code Playgroud)

__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'
Run Code Online (Sandbox Code Playgroud)

CPython源显示何时__trunc__使用.

  • 我的一个朋友找到了一个CPython源代码的链接,显示`__trunc__`进来的时候.如果你不介意,我会把它编辑成你的答案. (3认同)
  • 有趣的是,这不是Python文档中的任何地方 - 相反,唯一的参考是在PEP 3141:https://www.python.org/dev/peps/pep-3141/ (2认同)