构造自定义容器(Container)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 构造自定义容器(Container)

在Python中,如果我们想实现创建类似于序列和映射的类(可以迭代以及通过[下标]返回元素),可以通过重写魔法方法__getitem____setitem____delitem____len__方法去模拟。

魔术方法的作用:

__getitem__(self,key):返回键对应的值。

__setitem__(self,key,value):设置给定键的值

__delitem__(self,key):删除给定键对应的元素。

__len__():返回元素的数量

'''
    desc:尝试定义一种新的数据类型
          等差数列
'''
class ArithemeticSequence:
    def __init__(self, start=0, step=1):
        print('Call function __init__')
        self.start = start
        self.step = step
        self.myData = {}
    # 定义获取值的方法
    def __getitem__(self, key):
        print('Call function __getitem__')
        try:
            return self.myData[key]
        except KeyError:
            return self.start + key * self.step
    # 定义赋值方法
    def __setitem__(self, key, value):
        print('Call function __setitem__')
        self.myData[key] = value
    # 定义获取长度的方法
    def __len__(self):
        print('Call function __len__')
        return len(self.myData)
    # 定义删除元素的方法
    def __delitem__(self, key):
        print('Call function __delitem__')
        del self.myData[key]
s = ArithemeticSequence(1, 2)
print(s[0])
print(s[1])
print(s[2])
print(s[3])# 这里应该执行self.start+key*self.step,因为没有3这个key
s[3] = 100  # 进行赋值
print(s[3]) # 前面进行了赋值,那么直接输出赋的值100
print(len(s))
del s[3]  # 删除3这个key

输出结果:

Call function __init__
Call function __getitem__
1
Call function __getitem__
3
Call function __getitem__
5
Call function __getitem__
7
Call function __setitem__
Call function __getitem__
100
Call function __len__
1
Call function __delitem__

这些魔术方法的原理就是:当我们对类的属性item进行下标的操作时,首先会被__getitem__()、__setitem__()、__delitem__()拦截,从而执行我们在方法中设定的操作,如赋值,修改内容,删除内容等等。

相关文章
|
4月前
|
Java API 容器
java的图形化界面编程AWT与Swing学习记录与分享(其一container容器)
java的图形化界面编程AWT与Swing学习记录与分享(其一container容器)
53 0
|
算法 程序员 C语言
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
51 0
|
1月前
|
存储 C++ 容器
set容器一自定义数据类型指定排序规则讲解
set容器一自定义数据类型指定排序规则讲解
18 1
|
1月前
|
C++ 容器
set容器-构造和赋值讲解
set容器-构造和赋值讲解
17 0
|
1月前
|
存储 C++ 容器
Map容器-构造和赋值讲解
Map容器-构造和赋值讲解
23 0
|
1月前
|
前端开发 C++ 容器
deaue容器一构造函数讲解
deaue容器一构造函数讲解
7 0
|
7月前
|
网络协议 应用服务中间件 nginx
容器的自定义网络
本实验介绍了如何在容器中创建和使用自定义网络
235 0
|
4月前
|
网络协议 应用服务中间件 nginx
一文详解Docker容器(Container)
一文详解Docker容器(Container)
|
10月前
|
存储 C++ 容器
<C++>map 容器快速上手|自定义数据类型排序的避坑理解(下)
<C++>map 容器快速上手|自定义数据类型排序的避坑理解
165 0
<C++>map 容器快速上手|自定义数据类型排序的避坑理解(下)
|
10月前
|
存储 C++ 索引
<C++>map 容器快速上手|自定义数据类型排序的避坑理解(上)
<C++>map 容器快速上手|自定义数据类型排序的避坑理解
126 0