[Python进阶] 定制类:模拟篇

4.10.5 模拟篇

4.10.5.1 call

通过__call__魔法方法可以像使用函数一样使用对象。通过括号的方式调用,也可以像函数一样传入参数:

py 复制代码
from icecream import ic


class Multiplier:
    def __init__(self, mul):
        self.mul = mul

    def __call__(self, arg):
        return self.mul * arg


o = Multiplier(3)
ic(o(4))

11:15:45|> o(4): 12

4.10.5.2 len

当我们对某个自定义对象使用len函数时,其实就是在调用这个魔术方法。

py 复制代码
from icecream import ic


class MyList:
    def __init__(self, data):
        self._data = data

    def __len__(self):
        return len(self._data)


x = MyList([1, 2, 3])
ic(len(x))
if x:
    ic('OK')

11:23:21|> len(x): 3

11:23:21|> 'OK'

当我们用自定义的对象作为判断条件时,如果我们的自定义对象中没有定义__bool__魔术方法,那么会通过__len__魔术方法进行判断,不为空则返回True。

4.10.5.3 getitemsetitem

当我们尝试用[]的形式调用或赋值对象中的元素时会用调用这两个魔术方法:

py 复制代码
from icecream import ic


class MyList:
    def __init__(self, data):
        self._data = data

    def __getitem__(self, key):
        return self._data[key]

    def __setitem__(self, key, value):
        self._data[key] = value


x = MyList([1, 2, 3])
ic(x[2])
x[2] = 5
ic(x[2])

14:48:12|> x2: 3

14:48:13|> x2: 5

4.10.5.4 delitem

在del objn时会调用这个魔术方法。

py 复制代码
from icecream import ic


class MyList:
    def __init__(self, data):
        self._data = data

    def __getitem__(self, key):
        return self._data[key]

    def __delitem__(self, key):
        self._data = self._data[0:key] + self._data[key + 1:]


x = MyList([1, 2, 3])
ic(x[1])
del x[1]
ic(x[1])

14:55:20|> x1: 2

14:55:20|> x1: 3

4.10.5.5 reversed

reversed :reverse(obj)

当用Python内置的函数reverse对象时会调用对象内的该方法。

py 复制代码
from icecream import ic


class MyList:
    def __init__(self, data):
        self._data = data

    def __getitem__(self, key):
        return self._data[key]

    def __reversed__(self):
        return MyList(self._data[::-1])


x = MyList([1, 2, 3])
ic(reversed(x)._data)

15:03:55|> reversed(x)._data: 3, 2, 1

4.10.5.6 contains

contains :item in obj

做in操作时会调用该方法。

py 复制代码
from icecream import ic


class MyList:
    def __init__(self, data):
        self._data = data

    def __contains__(self, item):
        return item in self._data


x = MyList([1, 2, 3])
ic(1 in x)
ic(4 in x)

15:05:22|> 1 in x: True

15:05:22|> 4 in x: False

4.10.5.7 iter

iter :iter(obj)

返回对象的迭代器(iter)时会调用该方法。

4.10.5.8 missing

这个魔术方法必须是Python的字典类型数据的子类中才有作用。当在字典中找一个key而找不到时,会调用这个方法。

py 复制代码
from icecream import ic


class MyDict(dict):
    def __missing__(self, key):
        return 1


d = MyDict()
ic(d[0])

15:10:06|> d0: 1

4.10.5.9 enterexit

这两个魔术方法和上下文管理器有关,在之前的章节中已经详细介绍了。这里就不赘述了。

相关推荐
小大宇6 分钟前
python sqlalchemy 案例
开发语言·python
名字还没想好☜34 分钟前
Go 结构体内存对齐:调整字段顺序,同样的字段省下 40% 内存
开发语言·后端·golang·go·内存对齐
玛丽莲茼蒿36 分钟前
很难出错的Spring5(十)—— IOC进阶
java·开发语言·jvm
Ulyanov36 分钟前
雷达导引头仿真中的坐标系——从惯性系到量测角
开发语言·python·算法·系统仿真·雷达信号处理·雷达导引头
codeboss38 分钟前
做网页变更监控,我在“降噪”上踩过的 7 个坑
爬虫·python
果汁华1 小时前
CLI 命令行与 Python 框架实战
git·python·github
Maiko Star1 小时前
FastAPI 进阶三部曲:中间件、依赖注入与 ORM 实战
python·中间件·fastapi
MrDJun1 小时前
长期稳定跑网页监控:TLS 指纹、代理选路与请求节流的工程实践
运维·爬虫·python·网络协议·网站监控
m沐沐1 小时前
【计算机视觉】OpenCV 物体跟踪——原理、算法与CSRT跟踪器实战
人工智能·python·深度学习·opencv·算法·计算机视觉·人脸识别
前鼻音太阳熊1 小时前
【MES系统】- 工业HMI状态机可视化实践:从手写SVG到Cytoscape.js的技术选型与踩坑
开发语言·javascript·ecmascript