什么是Python魔法方法

什么是魔法方法呢?它们在面向对象的Python的处处皆是。它们是一些可以让你对类添加“魔法”的特殊方法。 它们经常是两个下划线包围来命名的(比如 init, lt )。但是现在没有很好的文档来解释它们。 所有的魔法方法都会在Python的官方文档中找到,但是它们组织松散。而且很少会有示例(有的是无聊的语法描述, 语言参考)。

魔法方法就如同它的名字一样神奇,总能在你需要的时候为你提供某种方法来让你的想法实现。魔法方法是指Python内部已经包含的,被双下划线所包围的方法,这些方法在进行特定的操作时会自动被调用,它们是Python面向对象下智慧的结晶。初学者掌握Python的魔法方法也就变得尤为重要了。

为什么要使用Python魔法方法

使用Python的魔法方法可以使Python的自由度变得更高,当不需要重写时魔法方法也可以在规定的默认情况下生效,在需要重写时也可以让使用者根据自己的需求来重写部分方法来达到自己的期待。而且众所周知Python是支持面向对象的语言Python的基本魔法方法就使得Python在面对对象方面做得更好。

魔法方法名

说明

基础魔法方法(较为常用)

new(cls[, ...])

1.实例化对象时第一个被调用的方法

2.其参数直接传递给init方法处理

3.我们一般不会重写该方法


init(self[, ...])    构造方法,初始化类的时候被调用 del(self)    析构方法,当实例化对象被彻底销毁时被调用(实例化对象的所有指针都被销毁时被调用) call(self[, args...])    允许一个类的实例像函数一样被调用:x(a, b) 调用 x.call(a, b) len(self)    定义当被 len() 调用时的行为 repr(self)    定义当被 repr() 调用时的行为 str(self)    定义当被 str() 调用时的行为 bytes(self)    定义当被 bytes() 调用时的行为 hash(self)    定义当被 hash() 调用时的行为 bool(self)    定义当被 bool() 调用时的行为,应该返回 True 或 False format(self, format_spec)    定义当被 format() 调用时的行为

属性相关的方法


getattr(self, name)    定义当用户试图获取一个不存在的属性时的行为 getattribute(self, name)    定义当该类的属性被访问时的行为 setattr(self, name, value)    定义当一个属性被设置时的行为 delattr(self, name)    定义当一个属性被删除时的行为 dir(self)    定义当 dir() 被调用时的行为 get(self, instance, owner)    定义当描述符的值被取得时的行为 set(self, instance, value)    定义当描述符的值被改变时的行为 delete(self, instance)    定义当描述符的值被删除时的行为

 比较操作符


lt(self, other)    定义小于号的行为:x < y 调用 x.lt(y) le(self, other)    定义小于等于号的行为:x <= y 调用 x.le(y) eq(self, other)    定义等于号的行为:x == y 调用 x.eq(y) ne(self, other)    定义不等号的行为:x != y 调用 x.ne(y) gt(self, other)    定义大于号的行为:x > y 调用 x.gt(y) ge(self, other)    定义大于等于号的行为:x >= y 调用 x.ge(y)

 算数运算符|


def __add__(self, other):    # 定义加法的行为:+
def __sub__(self, other):    # 定义减法的行为:-
def __mul__(self, other):    # 定义乘法的行为:*
def __truediv__(self, other):    # 定义真除法的行为:/
def __floordiv__(self, other):    # 定义整数除法的行为://
def __mod__(self, other):    # 定义取模算法的行为:%
def __divmod__(self, other):    # 定义当被 divmod() 调用时的行为
def __pow__(self, other[, modulo]):    # 定义当被 power() 调用或 ** 运算时的行为
def __lshift__(self, other):    # 定义按位左移位的行为:<<
def __rshift__(self, other):    # 定义按位右移位的行为:>>
def __and__(self, other):    # 定义按位与操作的行为:&
def __xor__(self, other):    # 定义按位异或操作的行为:^
def __or__(self, other):    # 定义按位或操作的行为:

反运算(类似于运算方法)


radd(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 rsub(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 rmul(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 rtruediv(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用  rfloordiv(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 rmod(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 rdivmod(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 rpow(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 rlshift(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 rrshift(self, other)      当被运算对象(左边的操作对象)不支持该运算时被调用 rxor(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用 ror(self, other)     当被运算对象(左边的操作对象)不支持该运算时被调用

 增量赋值运算


iadd(self, other)    定义赋值加法的行为:+= isub(self, other)    定义赋值减法的行为:-= imul(self, other)    定义赋值乘法的行为:*= itruediv(self, other)    定义赋值真除法的行为:/= ifloordiv(self, other)    定义赋值整数除法的行为://= imod(self, other)    定义赋值取模算法的行为:%= ipow(self, other[, modulo])    定义赋值幂运算的行为:**= ilshift(self, other)    定义赋值按位左移位的行为:<<= irshift(self, other)    定义赋值按位右移位的行为:>>= iand(self, other)    定义赋值按位与操作的行为:&= ixor(self, other)    定义赋值按位异或操作的行为:^= ior(self, other)    定义赋值按位或操作的行为:|=

 一元操作符


neg(self)    定义正号的行为:+x pos(self)    定义负号的行为:-x abs(self)    定义当被 abs() 调用时的行为 invert(self)    定义按位求反的行为:~x

类型转换


complex(self)    定义当被 complex() 调用时的行为(需要返回恰当的值) int(self)    定义当被 int() 调用时的行为(需要返回恰当的值) float(self)    定义当被 float() 调用时的行为(需要返回恰当的值) round(self[, n])    定义当被 round() 调用时的行为(需要返回恰当的值) index(self)    1. 当对象是被应用在切片表达式中时,实现整形强制转换,2. 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 index,3. 如果 index 被定义,则 int 也需要被定义,且返回相同的值

上下文管理(with 语句)


def __enter__(self): # 1. 定义当使用 with 语句时的初始化行为,2. enter 的返回值被 with 语句的目标或者 as 后的名字绑定
def __exit__(self, exc_type, exc_value, traceback): # 1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么, 2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作

容器类型(一般用于操作容器类)


def __len__(self): # 定义当被 len() 调用时的行为(一般返回容器类的长度)
def __getitem__(self, key): # 定义获取容器中指定元素的行为,相当于 self[key]
def __setitem__(self, key, value): # 定义设置容器中指定元素的行为,相当于 self[key] = value
def __delitem__(self, key): # 定义删除容器中指定元素的行为,相当于 del self[key]
def __iter__(self): # 定义当迭代容器中的元素的行为
def __reversed__(self): # 定义当被 reversed() 调用时的行为
def __contains__(self, item): # 定义当使用成员测试运算符(in 或 not in)时的行为

来源:https://blog.csdn.net/weixin_43613890/article/details/85089896

python 魔法方法诠释的更多相关文章

  1. Python魔法方法总结及注意事项

    1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...

  2. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  3. python魔法方法大全

    1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...

  4. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...

  5. 1. Python 魔法方法

    Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...

  6. with上下文管理 python魔法方法

    with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...

  7. python 魔法方法

    I am not a creator, I just a porter. Note: Everything is object in python. 对于Python来说一切都是对象,也就是函数的参数 ...

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

    h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...

  9. python 魔法方法(学习过程的笔记)

    有小伙伴会问,什么是python的魔法方法,python的魔法方法有什么用呢, 它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两 ...

随机推荐

  1. JS手写call、bind、apply

    call方法的实现 Function.prototype.MyCall = function(content,...args){ const self = content || window; con ...

  2. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(三):创建使用[ClientCredentials客户端凭证]授权模式的客户端

    配套源码:https://gitee.com/jardeng/IdentitySolution 上一篇<ASP.NET Core3.1使用IdentityServer4中间件系列随笔(二):创建 ...

  3. [CSP-S2019]划分 题解

    CSP-S2 2019 D2T2 考场上读完题感觉是DP就直接扔了开T3了,考完才发现部分分好像不难拿,枯了 题意分析 给出一个数列,要求将其分成几段,使每段的和非严格递增,求最小的每段的和的平方和. ...

  4. txt工具大全(TXT文件合并、txt批量替换、编码转换器)

    http://www.wocaoseo.com/thread-301-1-1.html txt是我们在seo中常用的处理对象,但是在这个处理过程中可能有些细节需要注意,比如有些有编码问题,我们就需要编 ...

  5. 跟我一起学.NetCore之日志作用域及第三方日志框架扩展

    前言 上一节对日志的部分核心类型进行简单的剖析,相信现在再使用日志的时候,应该大概知道怎么一回事了,比如记录器是怎么来的,是如何将日志内容写入到不同目的地的等:当然还有很多细节没深入讲解,抽时间小伙伴 ...

  6. Python 批量下载BiliBili视频 打包成软件

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  7. ES6常用总结(一)

    let,const let声明变量,const声明常量,两者均为块级作用域 let,const在块级作用域内不允许重复声明 const声明的基本数据类型不可以修改,引用数据类型可以修改.具体看我的另一 ...

  8. steam 数据转换

    目录 数组和集合互转 数组转集合 方法一 遍历 方法二 asList 方法三 steam 集合转数组 方法一 循环 方法二 toArray 方法三 steam 小结 string转为Character ...

  9. CVPR2020 面向密集多角度物体检测的动态修正网络(DRN)

    论文链接:https://arxiv.org/pdf/2005.09973.pdf code:https://github.com/Anymake/DRN_CVPR2020 文章概要: 本文是中科院自 ...

  10. Codeforces 1321C Remove Adjacent

    题意 给你一个字符串,字符\(s_i\)可以被伤处当且仅当\(s_{i-1}=s_i-1\)或\(s_{i+1}=s_i-1\).问最多能删几个字符. 解题思路 其实,有个很简单的做法就是从\(z\) ...