python魔方方法__getitem__、__setitem__和__len__
python魔方方法__getitem__、setitem__和__len
目录
- python魔方方法__getitem__、__setitem__和__len__
- 一、简介
- 二、详解
- 三、代码
- 四、Reference
一、简介
当我们重载了类的__getitem__
和__setitem__
方法后,我们便可以对该类的实例,通过[]
索引运算符来进行取值和赋值。具体而言__getitem__
对于的是取值运算,而__setitem__
对应的是赋值运算。
注意:重载上述的magic method仅仅支持修改值和查看值,并不支持切片运算
注意:要想支持切片方法,还需要重载__len__
方法
二、详解
__setitem__语法:object.__getitem__(self, key)
参数:
- self指代自身类的实例
- key指代sequence对象的索引,如果对象缺少为sequence,那么key要为整数
__getitem__语法:object.__setitem__(self, key, value)
参数:
- self指代自身类的实例
- key指代index
- value指代需要传入的新值
__len__语法:object.__len__(self)
参数:
- self指代自身类的实例
返回值:
- 需要返回长度的整数值
三、代码
举一个简单的例子,简单自定义一个用户列表类,为了使用索引运算符,我们重载了该类的__getitem__和__setitem__方法
class CustomList(object):def __init__(self, *args):self.slots = list(args)def __getitem__(self, key):return self.slots[key]def __setitem__(self, key, data):self.slots[key] = datadef __len__(self):return len(self.slots)def __repr__(self): # 用于终端显示,与本博文关系不大return str(self.slots)a = CustomList(1,2,3,4)
print(a)print(a[0]) # 查看a[0]的值
a[0] = 'something' # 修改a[0]的值
print(a)print(a[0:2]) # 定义__len__方法后支持切片访问
a[0:2] = 9,10 # 支持切片赋值
print(a)
[1, 2, 3, 4]
1
['something', 2, 3, 4]
['something', 2]
[9, 10, 3, 4]
举一个自定义HashTable实现映射的例子,slots用于存储hash值,data用于存储具体数据。
# 利用hash表完成map映射
class HashTAble(object):def __init__(self, size=11):self.size = sizeself.slots = [None] * self.sizeself.data = [None] * self.sizedef hashfunc(self, key):return key % self.sizedef rehash(self, oldhashvalue):return (oldhashvalue + 1) % self.sizedef put(self, key, data):hashvalue = self.hashfunc(key)if self.slots[hashvalue] == None:self.slots[hashvalue] = keyself.data[hashvalue] = dataelse:if self.slots[hashvalue] == key: # 替换self.data[hashvalue] = datanextslot = self.rehash(hashvalue) # 处理hash值的计算冲突while self.slots[nextslot] != None and \self.slots[nextslot] != key:nextslot = self.rehash(nextslot)if self.slots[nextslot] == None:self.slots[nextslot] = keyself.data[nextslot] = dataelse:self.data[nextslot] = data # 替换def get(self, key):stop = Falsefound = Falsestartslot = self.hashfunc(key)pos = startslotwhile self.slots[pos] != None and \not found and not stop:if self.slots[pos] == key:found = Truereturn self.slots[pos]else:pos = self.rehash(pos)if pos == startslot:stop = Truedef __getitem__(self, key):return self.get(key)def __setitem__(self, key, data):self.put(key, data)H = HashTAble()
H[20] = 'cat'
print(H.slots)
print(H.data)
print(H.get(20))
print(H[20])
[None, None, None, None, None, None, None, None, None, 20, None]
[None, None, None, None, None, None, None, None, None, 'cat', None]
20
20
四、Reference
《Python数据结构与算法分析_2nd》
https://docs.python.org/zh-cn/3.9/reference/datamodel.html?highlight=object%20__getitem__#object.getitem
python魔方方法__getitem__、__setitem__和__len__相关推荐
- python魔方方法__call__
python魔方方法__call__ 目录 python魔方方法__call__ 一.简介 二.详解 三.代码 四.Reference 一.简介 当一个类,实现了__call__方法,那么这个类的实例 ...
- python魔方方法__add__、__mul__、__sub__、__truediv__
python魔方方法__add__.__mul__.__sub__.__truediv__ 目录 python魔方方法`__add__.__mul__.__sub__.__truediv__` 一.简 ...
- Python —— 魔方方法
在Python中 方法名为:XXX() 就是魔方方法 init() 初始化函数,用于完成默认的设置 new() 返回一个对象的实例,init() 无返回值 new()是一个类方法 del() 析构方法 ...
- Python魔方方法详解
原文链接: https://fishc.com.cn/forum.php?mod=viewthread&tid=48793&extra=page%3D1%26filter%3Dtype ...
- Python 魔方方法
class Person:# 默认打印对象,显示类名+地址# 重写该方法,打印该方法的返回值def __str__(self):return '我叫{},今年{}岁'.format(self.name ...
- Python——魔方方法
在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",中文称『魔术方法』,例如类的初始化方法 init ,Python中所 ...
- python 魔法方法之:__getitem__ __setitem__ __delitem__
python的魔法方法: 在Python中,如果我们想实现创建类似于序列和映射的类,可以通过重写魔法方法__getitem__.__setitem__.__delitem__.__len__方法去模拟 ...
- Python入门基础(下)之魔方方法
Python入门基础(下)之魔方方法 一.学习内容概括 学习地址:https://tianchi.aliyun.com/s/58327c15d1faee512c008128d3bb9e32 今天主要学 ...
- Python Day 9 魔方方法 -待理解
目录 魔法方法 1.基本的魔法方法 2.算术运算符 3.反算术运算符 4.增量赋值运算符 5.一元运算符 6.属性访问 7.描述符 8.定制序列 9.迭代器 10.生成器 习题: 魔法方法 魔法方法总 ...
最新文章
- C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板
- Java中获取实体List中某时间属性离当前时间最近的实体类的某一属性
- 主梁弹性模量计算_如何用梁格法计算曲线梁桥?
- mysql不被其他ip访问_mysql数据库无法被其他ip访问的解决方法
- scala 字段覆盖_Scala中的字段覆盖
- 201809-1 卖菜
- Linux之yum软件管理
- U盘一键直接安装原版win7
- kaggle--猫狗数据集分类
- 简单将xml数据转换为txt数据
- 上海2016年房价己见
- 【为人处事】:如何识人
- [git]warning: LF will be replaced by CRLF in 解决办法
- 贝壳IPO背后最别致的光彩:看不见的价值观
- 机器指令与微指令的关系
- 京东走微信“后门”是福是祸?
- vue2实现传送门效果
- NAS不够快?那就上SSD享受如火箭般的体验吧!
- CPU与Cache、内存以及硬盘之间的数据交换
- 让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析