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__相关推荐

  1. python魔方方法__call__

    python魔方方法__call__ 目录 python魔方方法__call__ 一.简介 二.详解 三.代码 四.Reference 一.简介 当一个类,实现了__call__方法,那么这个类的实例 ...

  2. python魔方方法__add__、__mul__、__sub__、__truediv__

    python魔方方法__add__.__mul__.__sub__.__truediv__ 目录 python魔方方法`__add__.__mul__.__sub__.__truediv__` 一.简 ...

  3. Python —— 魔方方法

    在Python中 方法名为:XXX() 就是魔方方法 init() 初始化函数,用于完成默认的设置 new() 返回一个对象的实例,init() 无返回值 new()是一个类方法 del() 析构方法 ...

  4. Python魔方方法详解

    原文链接: https://fishc.com.cn/forum.php?mod=viewthread&tid=48793&extra=page%3D1%26filter%3Dtype ...

  5. Python 魔方方法

    class Person:# 默认打印对象,显示类名+地址# 重写该方法,打印该方法的返回值def __str__(self):return '我叫{},今年{}岁'.format(self.name ...

  6. Python——魔方方法

    在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",中文称『魔术方法』,例如类的初始化方法 init ,Python中所 ...

  7. python 魔法方法之:__getitem__ __setitem__ __delitem__

    python的魔法方法: 在Python中,如果我们想实现创建类似于序列和映射的类,可以通过重写魔法方法__getitem__.__setitem__.__delitem__.__len__方法去模拟 ...

  8. Python入门基础(下)之魔方方法

    Python入门基础(下)之魔方方法 一.学习内容概括 学习地址:https://tianchi.aliyun.com/s/58327c15d1faee512c008128d3bb9e32 今天主要学 ...

  9. Python Day 9 魔方方法 -待理解

    目录 魔法方法 1.基本的魔法方法 2.算术运算符 3.反算术运算符 4.增量赋值运算符 5.一元运算符 6.属性访问 7.描述符 8.定制序列 9.迭代器 10.生成器 习题: 魔法方法 魔法方法总 ...

最新文章

  1. C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板
  2. Java中获取实体List中某时间属性离当前时间最近的实体类的某一属性
  3. 主梁弹性模量计算_如何用梁格法计算曲线梁桥?
  4. mysql不被其他ip访问_mysql数据库无法被其他ip访问的解决方法
  5. scala 字段覆盖_Scala中的字段覆盖
  6. 201809-1 卖菜
  7. Linux之yum软件管理
  8. U盘一键直接安装原版win7
  9. kaggle--猫狗数据集分类
  10. 简单将xml数据转换为txt数据
  11. 上海2016年房价己见
  12. 【为人处事】:如何识人
  13. [git]warning: LF will be replaced by CRLF in 解决办法
  14. 贝壳IPO背后最别致的光彩:看不见的价值观
  15. 机器指令与微指令的关系
  16. 京东走微信“后门”是福是祸?
  17. vue2实现传送门效果
  18. NAS不够快?那就上SSD享受如火箭般的体验吧!
  19. CPU与Cache、内存以及硬盘之间的数据交换
  20. 让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析

热门文章

  1. 日常学习——记使用POI多线程写Excel数据(续)
  2. big sur 虚拟机 网络_推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题...
  3. FIR滤波器和IIR滤波器的区别和选择
  4. H3C模拟器---HCL使用心得
  5. windows命令行连接远程服务器MongoDB
  6. 计算机专业学生如何找到一份优质实习?如何进大厂呢?
  7. MYSQL语句大全(SQL 高级教程)【上】
  8. 输入姓名并分别输出姓和名
  9. 我要搬家到51CTO了
  10. 在SAR-Opt数据融合领域针对深度学习的SEN1-2数据集