gpt4 book ai didi

python - 不明白为什么 `__index__` 方法有效

转载 作者:太空宇宙 更新时间:2023-11-04 00:52:04 24 4
gpt4 key购买 nike

我正在处理这个 tutorial它具有以下二进制类:

import collections

class Binary:
def __init__(self, value=0):
if isinstance(value, collections.Sequence):
if len(value) > 2 and value[0:2] == '0b':
self._value = int(value, base=2)
elif len(value) > 2 and value[0:2] == '0x':
self._value = int(value, base=16)
else:
self._value = int(''.join([str(i) for i in value]), base=2)
else:
try:
self._value = int(value)
if self._value < 0:
raise ValueError("Binary cannot accept negative numbers. Use SizedBinary instead")
except ValueError:
raise ValueError("Cannot convert value {} to Binary".format(value))

def __int__(self):
return self._value

当使用 pytest 运行单元测试时,我们得到:

    def test_binary_hex():
binary = Binary(6)
> assert hex(binary) == '0x6'
E TypeError: 'Binary' object cannot be interpreted as an integer

为了解决这个问题,文章指出:

According to the official documentation, "If x is not a Python int object, it has to define an __index__() method that returns an integer." so this is what we are missing. As for __index__(), the documentation states that "In order to have a coherent integer type class, when __index__() is defined __int__() should also be defined, and both should return the same value."

所以我们只需要添加

def __index__(self):
return self.__int__()

这确实有效,但为什么这里写的 __index____int__ 返回相同的值?关于:

def __index__(self):
return self.__int__()

不应该是: 返回 self._value.__int__()

编辑:

与:

    def __int__(self):
return self._value

这对我来说很有意义,因为 _value 是一个整数。

与:

def __index__(self):
return self.__int__()

在这种情况下, self 又是一个 class 的实例,理论上它可以有很多属性(尽管在这种情况下不是)。我不明白如何返回 self.__int__(),如果我们不这样做,__int__() 知道如何获取存储在 _value 中的整数不要将 _value 显式传递给 __int__()

最佳答案

self._value 是一个 int,调用 int 上的 __int__() 方法返回相同的值,所以写:

return self._value.__int__()

会做同样的事情:

return self._value

为了证明我的观点,它与:

return int(int(int(int(self._value))))

在大多数情况下,您可以编写 __index__ 作为同一函数的直接别名:

def __int__(self):
return self._value
__index__ = __int__

附言你可能想看看 PEP 357 __index__ 方法存在的原因。

基本上是区分可以转换为 int 的对象和本质上是整数的对象:

>>> int(1.3)
1
>>> hex(1.3)
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
hex(1.3)
TypeError: 'float' object cannot be interpreted as an integer

关于python - 不明白为什么 `__index__` 方法有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36695699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com