Python3 实现自定义对象的切片,__getitem__方法

如果实现了一个对象,它包含列表或自定义数据结构,如何对它进行切片呢?

首先,定义自定义数据结构类

Python
# -*- coding: utf-8 -*- __author__ = 'songhao' from collections import Sequence class MyList(Sequence): """ 实现 Mylist 基本操作,删除,添加,切片,返回值 """ def __init__(self, data): self.data = data def __str__(self): return str(self.data) def __repr__(self): return str(self.data) def __len__(self): return len(self.data) def append(self, item): self.data.append(item) def remove(self, item): self.data.remove(item) def __<span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/getitem" title="View all posts in getitem" target="_blank">getitem</a></span>__(self, sliced): return self.data[sliced] if __name__ == '__main__': my = MyList([1, 2, 3]) print(my) my.append("heloo") my.remove(3) print(my) print(my[-1])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# -*- coding: utf-8 -*-
__author__ = 'songhao'
 
from collections import Sequence
 
 
class MyList ( Sequence ) :
     """
    实现 Mylist 基本操作,删除,添加,切片,返回值
    """
     def __init__ ( self , data ) :
         self . data = data
 
     def __str__ ( self ) :
         return str ( self . data )
 
     def __repr__ ( self ) :
         return str ( self . data )
 
     def __len__ ( self ) :
         return len ( self . data )
 
     def append ( self , item ) :
         self . data . append ( item )
 
     def remove ( self , item ) :
         self . data . remove ( item )
 
     def __getitem__ ( self , sliced ) :
         return self . data [ sliced ]
 
 
if __name__ == '__main__' :
     my = MyList ( [ 1 , 2 , 3 ] )
     print ( my )
     my . append ( "heloo" )
     my . remove ( 3 )
     print ( my )
     print ( my [ - 1 ] )

结果是:

这里声明了一个类,它包含了一个作为数据结构的列表。MyStructure实际上没有实现太多内容,但已经可以添加、删除、获取项了。要留意的是__getitem__方法。任何时候需要从结构中获取一个项时都可以调用此方法。当调用structure[0]时,实际上调用的时__getitem__方法,并返回该方法所返回的内容。在实现列表样式的对象时,这是很有用的。

现在创建自定义对象,添向其中添加一个项:

Python
In [1]: from c4 import MyList In [2]: m = MyList([1,2,3]) In [3]: m Out[3]: <c4.MyList at 0x10ca39da0> In [4]: m.append(2222) In [5]: print(m) [1, 2, 3, 2222] In [6]: m.remove(1) In [7]: m[-1] Out[7]: 2222 In [10]: m[:3] Out[10]: [2, 3, 2222] 很简单 实现了切片的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
In [ 1 ] : from c4 import MyList
 
In [ 2 ] : m = MyList ( [ 1 , 2 , 3 ] )
 
In [ 3 ] : m
Out [ 3 ] : < c4 . MyList at 0x10ca39da0 >
 
In [ 4 ] : m . append ( 2222 )
 
In [ 5 ] : print ( m )
[ 1 , 2 , 3 , 2222 ]
 
In [ 6 ] : m . remove ( 1 )
 
In [ 7 ] : m [ - 1 ]
Out [ 7 ] : 2222
 
In [ 10 ] : m [ : 3 ]
Out [ 10 ] : [ 2 , 3 , 2222 ]
 
很简单 实现了切片的操作



  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
### Python 中 `__getitem__` 魔术方法的使用与实现 #### 什么是 `__getitem__` `__getitem__` 是 Python 的一种魔术方法,主要用于定义对象如何响应索引操作。当对一个对象执行索引访问(如 `obj[key]`)时,Python 解释器会自动调用该对象的 `__getitem__` 方法[^1]。 #### 基本功能 `__getitem__` 提供了一种机制,使得自定义类可以模拟内置容器类型的行为,比如列表、字典或元组。通过重载此方法,可以让对象支持按索引或键的方式访问其内部数据结构[^3]。 #### 实现方式 为了使某个类能够支持索引操作,可以在类中定义 `__getitem__` 方法。下面是一个简单的例子: ```python class MyCollection: def __init__(self, data): self.data = data def __getitem__(self, key): return self.data[key] # 创建实例并测试 my_obj = MyCollection([10, 20, 30]) print(my_obj[1]) # 输出: 20 ``` 在这个例子中,`MyCollection` 类实现了 `__getitem__` 方法,因此可以通过索引访问其中的数据[^4]。 #### 支持切片操作 除了单个索引外,`__getitem__` 还能处理切片操作。如果传递给它的参数是一个切片对象,则可以根据需求返回子集。 ```python class SliceableList: def __init__(self, items): self.items = items def __getitem__(self, index): if isinstance(index, slice): # 判断是否为切片 return self.items[index.start:index.stop:index.step] else: return self.items[index] # 测试切片功能 sl = SliceableList([1, 2, 3, 4, 5]) print(sl[1:4]) # 输出: [2, 3, 4] ``` 上述代码展示了如何让自定义类支持切片语法[^5]。 #### 结合其他魔术方法增强功能 单独使用 `__getitem__` 只能让对象具备基本的索引能力;但如果配合其他魔术方法一起使用,就能构建更强大的数据结构。例如,结合 `__len__` 和 `__iter__`,可以使对象完全兼容标准库函数以及循环语句的要求。 ```python class EnhancedContainer: def __init__(self, elements): self.elements = list(elements) def __getitem__(self, idx): return self.elements[idx] def __len__(self): return len(self.elements) ec = EnhancedContainer(range(5)) for item in ec: print(item) # 正常遍历输出 0 至 4 ``` 这里不仅实现了基于位置的取值逻辑,还提供了长度计算的功能,从而满足更多场景下的应用需求[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值