ITPub博客

首页 > 应用开发 > Python > Python数字协议的__index__实现

Python数字协议的__index__实现

原创 Python 作者:raptors 时间:2025-11-13 14:54:37 0 删除 编辑

# Python数字协议的`__index__`实现


在Python中,`__index__`是一个特殊方法,用于实现数字协议(Number Protocol),它允许对象在被需要整数的地方(如切片、索引或`bin()`、`hex()`、`oct()`等函数中)被转换为整数。


## `__index__`方法的基本用法


`__index__`方法应该返回一个整数,并且应该满足以下条件:

- 必须返回一个整数(`int`类型)

- 不应该有副作用

- 对于相同的对象应该返回相同的值


```python

class MyNumber:

    def __init__(self, value):

        self.value = value

        

    def __index__(self):

        return int(self.value)

```


## 使用示例


```python

n = MyNumber(42)


# 在需要整数的地方使用

print(bin(n))      # 输出: 0b101010

print(hex(n))      # 输出: 0x2a

print(oct(n))      # 输出: 0o52


# 在切片中使用

lst = [0, 1, 2, 3, 4, 5]

print(lst[n])      # 输出: 42(如果列表足够长)

```


## 与`__int__`的区别


`__index__`和`__int__`类似,但有不同用途:

- `__int__`用于`int()`转换和算术运算

- `__index__`专门用于切片、索引和二进制/十六进制/八进制转换


```python

class MyNumber:

    def __init__(self, value):

        self.value = value

        

    def __index__(self):

        return int(self.value)

        

    def __int__(self):

        return int(self.value) + 10


n = MyNumber(5)

print(int(n))      # 输出: 15 (使用__int__)

print(bin(n))      # 输出: 0b101 (使用__index__)

```


## 实际应用场景


1. **自定义数字类型**:当你创建自己的数字类型并希望它能像整数一样用于索引和切片时

2. **非整数数字类型**:如分数、有理数等,可以定义如何转换为整数索引

3. **特殊索引逻辑**:实现复杂的索引逻辑,但在需要简单整数时提供转换


## 完整示例


```python

class BinaryNumber:

    def __init__(self, binary_str):

        self.binary = binary_str

https://zhiq.zhaopin.com/moment/73378282

https://zq.zhaopin.com/moment/73378259

https://zq-mobile.zhaopin.com/moment/73378259

https://zhiq.zhaopin.com/moment/73378259

https://zq.zhaopin.com/moment/73378250

https://zq-mobile.zhaopin.com/moment/73378250

https://zhiq.zhaopin.com/moment/73378250

https://zq.zhaopin.com/moment/73378247

https://zq-mobile.zhaopin.com/moment/73378247

https://zhiq.zhaopin.com/moment/73378247

https://zq.zhaopin.com/moment/73378245

https://zq-mobile.zhaopin.com/moment/73378245

https://zhiq.zhaopin.com/moment/73378245

https://zq.zhaopin.com/moment/73385254

https://zq-mobile.zhaopin.com/moment/73385254

https://zhiq.zhaopin.com/moment/73385254

https://zq.zhaopin.com/moment/73385008

https://zq-mobile.zhaopin.com/moment/73385008

https://zhiq.zhaopin.com/moment/73385008

https://zq.zhaopin.com/moment/73384909



        

    def __index__(self):

        return int(self.binary, 2)

        

    def __str__(self):

        return f"BinaryNumber('{self.binary}')"


bn = BinaryNumber('1101')

print(f"{bn} as index is {bn.__index__()}")  # 输出: BinaryNumber('1101') as index is 13

print(hex(bn))  # 输出: 0xd

print([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13][bn])  # 输出: 13

```


## 注意事项


1. `__index__`必须返回一个整数,否则会引发`TypeError`

2. 如果对象没有实现`__index__`但实现了`__int__`,在某些情况下Python会尝试使用`__int__`

3. 在Python 2.x中,`__index__`不存在,相关功能由`__int__`处理


通过实现`__index__`方法,你可以让你的自定义对象更自然地融入Python的数字生态系统。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34366/viewspace-3101286/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-29

  • 博文量
    20
  • 访问量
    20448