【问题标题】:Fraction object doesn't have __int__ but int(Fraction(...)) still worksFraction 对象没有 __int__ 但 int(Fraction(...)) 仍然有效
【发布时间】:2015-06-21 15:32:08
【问题描述】:

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

例如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

【问题讨论】:

    标签: python int fractions python-internals


    【解决方案1】:

    使用__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__

    【讨论】:

    • 我的一个朋友找到了一个指向 CPython 源代码的链接,该链接显示了 __trunc__ 何时出现。如果您不介意,我会将其编辑为您的答案。
    • 有趣的是,这在 Python 文档中并不存在 - 相反,唯一的参考是 PEP 3141:python.org/dev/peps/pep-3141
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2017-02-27
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多