一切皆对象。
“在Python中,魔法方法是指Python内部已经包含的,被双下划线所包围的方法,这些方法在进行特定的操作时会自动被调用,它们是Python面向对象下智慧的结晶,而使用Python的魔法方法可以使Python的自由度变得更高。”
首先我们先来看一下几个符号的“另类”使用:
\
在Python中主要有两种用法:
SyntaxError: EOL while scanning string literal
print("hello"\
"world")
\n
换行符、\t
制表符等可以直接在文本输出时使用。不需要使用反斜杠的场景:
当出现具有定义、注释性质,规定范围的符号时,则不需要续行符就可以换行:
例如:[]
,()
,{}
,或者注释语句
annotion = ``` A is not
B ```
通过定义其他的符号进行分割的场景,例如 plotly
'''构造trace,配置相关参数'''
# 散点图
trace = go.Scatter(
x = random_x,
y = random_y,
mode = 'markers'
)
+=
在之前的推送中使用还算频繁,这里就简单辨别一下这两个区别:
首先变量可以分为不可变类型和可变类型,对于不可变类型例如字符串、元组、数字,无论是执行 a = a+b 还是 a += b,a 的内存地址都会变,即生成了新的变量;对于可变变量时,例如列表:
my_list = my_list + new_list,my_list 会成为一个新的变量;
my_list += new_list,my_list 内存地址并不会发生变化,相当于 extend。
从方法的背后魔法方法可以清楚的解释这种现象: += 背后的魔法方法是 __iadd__ +背后的魔法方法是 __add__ 如果一个类,没有实现 __iadd__方法的话,python就会退一步调用__add__方法 总体来说,可变类型都有__iadd__方法,而不可变类型没有__iadd__方法
举个魔法方法的小例子:
>>> list1 = [a,b,c]
>>> list2 =[1,2,3]
>>> list1.__add__(list2)
[a,b,c,1,2,3]
# reduce方法
>>> from functools import reduce
>>> reduce(list.__add__, (list1,list2))
[a,b,c,1,2,3]
同理,=* 和 *=,区别是背后的魔法方法分别为__imul__和__mul__。在上述的场景中还可以使用 * 进行处理:
我们都知道,列表支持符号运算,例如+-*
;我们在列表生成式中也聊过迭代方式去快速进行列表处理,其中值得一提是itertools
内置模块,通过from itertools import chain
等方式调用。
*还可以用于列表解包后合并,
>>> list1 = [a,b,c]
>>> list2 =[1,2,3]
>>> [*list1,*list2]
[a,b,c,1,2,3]
“魔法方法是python内置方法,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法("__方法名__"),可以理解为重写内置函数。”