前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 魔术方法(四)非常用方法与运算符重载方法大合集

python 魔术方法(四)非常用方法与运算符重载方法大合集

作者头像
用户3147702
发布2022-06-27 13:24:57
4220
发布2022-06-27 13:24:57
举报
文章被收录于专栏:小脑斧科技博客

1. 引言

前面三篇文章中,我们介绍了最为常用的一系列 python 的魔术方法。

python 魔术方法(一) 自定义容器类与类属性控制

python 魔术方法(二) 对象的创建与单例模式的实现

python 魔术方法(三)对象的打印 -- __repr__ 与 __str__

还有一些并不是那么常用,但却会在你需要他们的关键时刻产生特别的效果的一系列魔术方法。 本文就将带你一一领略他们的用法和用途。

2. 可调用对象 — __call__

在 Python 中,方法是一种特殊的对象,他们除了可调用外,也和其他对象一样可以作为其他方法的参数。 利用特殊的魔术方法 — __call__ 我们可以让类实例也具有和普通方法一样的特性 — 可调用。

代码语言:javascript
复制
class TechlogTest:
    def __call__(self, *args, **kwargs):
        print('hello world')

if __name__ == '__main__':
    test = TechlogTest()
    test()

打印出了:

hello world

3. 深拷贝与浅拷贝

此前的文章中,我们已经介绍过深拷贝与浅拷贝: python 序列与深浅拷贝

3.1. 浅拷贝 — copy.copy

copy 包提供了浅拷贝和深拷贝的特性。 浅拷贝是将原始对象的所有数据都拷贝一份,但是原始数据中的子对象却并不进行拷贝,只是拷贝子对象的引用。 这样,虽然修改原始对象中任何普通元素都不会影响到拷贝出来的对象,但是对原始对象中子对象的修改就会同步到拷贝对象中。

代码语言:javascript
复制
>>> import copy
>>> alist = [1,2,3,["a","b"]]
>>> c = copy.copy(alist)
>>> c
[1, 2, 3, ['a', 'b']]
>>> alist[2] = 5
>>> alist
[1, 2, 5, ['a', 'b']]
>>> c
[1, 2, 3, ['a', 'b']]
>>> alist[3].append('c')
>>> alist
[1, 2, 5, ['a', 'b', 'c']]
>>> c
[1, 2, 3, ['a', 'b', 'c']]

3.2. 深拷贝 — copy.deepcopy

与浅拷贝不同,深拷贝会递归拷贝对象及其所有的子对象。

代码语言:javascript
复制
>>> import copy
>>> alist = [1,2,3,["a","b"]]
>>> c = copy.deepcopy(alist)
>>> alist[3].append("c")
>>> c
[1, 2, 3, ['a', 'b']]
>>> alist
[1, 2, 3, ['a', 'b', 'c']]

3.3. 魔术方法 __copy__ 与 __deepcopy__

对于基础类型,copy.copy 与 copy.deepcopy 两个操作可以分别如预期的工作,但对于我们的自定义类型,Python 解释器就无能为力了,如果想让 copy.copy 与 copy.deepcopy 能够正常工作,我们就必须实现下面两个魔术方法。

代码语言:javascript
复制
__copy__(self)
__deepcopy__(self, memodict={})

4. 上下文管理 — with … as

Python 2.5 引入了 with 关键字,用来实现程序运行上下文的自动清理。

代码语言:javascript
复制
with open("foo.txt") as fd:
    # do something use fd

上述代码在 with 块运行结束时会自动完成 fd 的 close 操作,那么,这是如何实现的呢。 当 with 块被执行时,解释器会自动调用对象的 __enter__ 方法。 而在 with 块结束时,解释器则会自动调用对象的 __exit__ 方法,__exit__ 方法最终可以选择返回 True 或抛出异常。

5. 反射

Python 有两个内置函数用来判断一个类的类型或继承关系:isinstance 和 issubclass。 虽然绝大部分情况下,我们只要按照默认的工作来使用他们即可,但某些特殊情况下,能够改变并指定他们的行为方式,将十分有用。

代码语言:javascript
复制
__instancecheck__(self, instance)
__subclasscheck__(self, subclass)

6. 运算符重载

6.1. 用于比较的魔术方法

__cmp__(self, other) — 是比较方法里面最基本的的魔法方法。 __eq__(self, other) — 定义相等符号的行为,== __ne__(self,other) — 定义不等符号的行为,!= __lt__(self,other) — 定义小于符号的行为,< __gt__(self,other) — 定义大于符号的行为,> __le__(self,other) — 定义小于等于符号的行为,<= __ge__(self,other) — 定义大于等于符号的行为,>=

6.2. 数值计算的魔术方法

6.2.1. 单目运算符和函数

__pos__(self) — 实现一个取正数的操作。 __neg__(self) — 实现一个取负数的操作。 __abs__(self) — 实现一个内建的abs()函数的行为。 __invert__(self) — 实现一个取反操作符(~操作符)的行为。 __round__(self, n) — 实现一个内建的round()函数的行为。 __floor__(self) — 实现math.floor()的函数行为。 __ceil__(self) — 实现math.ceil()的函数行为。 __trunc__(self) — 实现math.trunc()的函数行为。

6.2.2. 双目运算符或函数

__add__(self, other) — 实现一个加法。 __sub__(self, other) — 实现一个减法。 __mul__(self, other) — 实现一个乘法。 __floordiv__(self, other) — 实现一个“//”操作符产生的整除操作() __div__(self, other) — 实现一个“/”操作符代表的除法操作。 __truediv__(self, other) — 实现真实除法。 __mod__(self, other) — 实现一个“%”操作符代表的取模操作。 __divmod__(self, other) — 实现一个内建函数divmod() __pow__ — 实现一个指数操作(“**”操作符)的行为。 __lshift__(self, other) — 实现一个位左移操作(<<)的功能。 __rshift__(self, other) — 实现一个位右移操作(>>)的功能。 __and__(self, other) — 实现一个按位进行与操作(&)的行为。 __or__(self, other) — 实现一个按位进行或操作的行为。 __xor__(self, other) — 实现异或操作。

6.3. 增量运算

__iadd__(self, other) — 加法赋值。 __isub__(self, other) — 减法赋值。 __imul__(self, other) — 乘法赋值。 __ifloordiv__(self, other) — 整除赋值,地板除,相当于 //= 运算符。 __idiv__(self, other) — 除法赋值,相当于 /= 运算符。 __itruediv__(self, other) — 真除赋值。 __imod_(self, other) — 模赋值,相当于 %= 运算符。 __ipow__ — 乘方赋值,相当于 **= 运算符。 __ilshift__(self, other) — 左移赋值,相当于 <<= 运算符。 __irshift__(self, other) — 左移赋值,相当于 >>= 运算符。 __iand__(self, other) — 与赋值,相当于 &= 运算符。 __ior__(self, other) — 或赋值。 __ixor__(self, other) — 异或运算符,相当于 ^= 运算符。

6.4. 类型转换

__int__(self) — 转换成整型。 __long__(self) — 转换成长整型。 __float__(self) — 转换成浮点型。 __complex__(self) — 转换成复数型。 __oct__(self) — 转换成八进制。 __hex__(self) — 转换成十六进制。 __index__(self) — 如果你定义了一个可能被用来做切片操作的数值型,你就应该定义 __index__ __trunc__(self) — 当 math.trunc(self) 使用时被调用 __trunc__ 返回自身类型的整型截取。 __coerce__(self, other) — 执行混合类型的运算。

7. 参考资料

《流畅的 python》。 https://www.cnblogs.com/pyxiaomangshe/p/7927540.html。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引言
  • 2. 可调用对象 — __call__
  • 3. 深拷贝与浅拷贝
    • 3.1. 浅拷贝 — copy.copy
      • 3.2. 深拷贝 — copy.deepcopy
        • 3.3. 魔术方法 __copy__ 与 __deepcopy__
        • 4. 上下文管理 — with … as
        • 5. 反射
        • 6. 运算符重载
          • 6.1. 用于比较的魔术方法
            • 6.2. 数值计算的魔术方法
              • 6.2.1. 单目运算符和函数
              • 6.2.2. 双目运算符或函数
            • 6.3. 增量运算
              • 6.4. 类型转换
              • 7. 参考资料
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档