【发布时间】:2016-04-18 13:40:33
【问题描述】:
我正在处理这个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
为了解决这个问题,文章指出:
根据官方文档,“如果 x 不是 Python int 对象,则必须定义一个返回整数的
__index__()方法。”所以这就是我们所缺少的。至于__index__(),文档指出“为了有一个连贯的整数类型类,当定义__index__()时,还应该定义__int__(),并且两者都应该返回相同的值。”
所以我们只需要添加
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__(),如果我们不将 _value 明确传递给 __int__(),__int__() 知道获取存储在 _value 中的整数。
【问题讨论】:
-
它们返回相同的值,因为它们是这样写的;
__index__返回__int__的值。您或多或少只是将__int__方法别名为另一个名称。 -
您不需要
__index__将_value传递给__int__,因为__int__已经被编程为读取self上的_value属性。你确实明白self.__int__()调用了你之前定义的__int__方法,对吧? -
考虑添加一个中间步骤:
def __index__(self): x = self.__int__() ; return x您正在调用__int__方法,该方法获取_value属性并将其返回给__index__,然后从__index__返回到什么叫它。 -
谢谢,我现在明白了。
标签: python