python魔法方法是什么

Python012

python魔法方法是什么,第1张

魔方方法是Python的内置方法,无需主动调用,主要目的就是为了给Python的解释器进行调用,而且每个魔方方法都有一个对应的内置函数或运算符,接下来我们来看看具体的介绍。

魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, 那么这个方法就会在特殊的情况下被Python所调用,你可以定义自己想要的行为,而这一切都是自动发 生的,它们经常是两个下划线包围来命名的(比如 __init___ , __len__ ),Python的魔法方法是非常强大的所以了解其使用方法也变得尤为重要!

__init__ 构造器,当一个实例被创建的时候初始化的方法,但是它并不是实例化调用的第一个方法。

__new__ 才是实例化对象调用的第一个方法,它只取下cls参数,并把其他参数传给 __init___。

___new__ 很少使用,但是也有它适合的场景,尤其是当类继承自一个像元祖或者字符串这样不经常改变的类型的时候。

__call__ 让一个类的实例像函数一样被调用。

__getitem__ 定义获取容器中指定元素的行为,相当于self[key]。

__getattr__ 定义当用户试图访问一个不存在属性的时候的行为。

__setattr__ 定义当一个属性被设置的时候的行为。

__getattribute___ 定义当一个属性被访问的时候的行为。

首先,你一定用过魔术方法,也一定见过魔术方法。以下划线开头的方法,比如:

这些被统称为魔术方法。

给整数和字符串做加法:

我们写个表示城市的类,它有两个属性:城市名和人口。

然后我们给两个城市做加法,发现不能相加:

报错是说City不支持"+"号,如何让它支持"+"呢?需要给类加上魔术方法__add__就可以相加了。

我们给City添加一个__add__的方法,城市相加,人口相加,创建一个新的城市:

这说明__add__有一定的魔力,当我们用到加号"+"时,python就回去寻找这个方法,如果这个对象没有这个方法就会报错。

python中,所有的运算符都是通过魔术方法来实现的。

如果我们在City类有以下方法,就可以做加减乘除了:

我们再来打印int和str查看他们的方法,int有加减乘除,str只有__add__ __mul__,它只能做加法和乘法:

列表为什么能获取元素, __getitem__,可以再任何一个类里加上这个方法,然后也就可以用[]方括号来获取元素:

我们使用最多的方法一定是__new__和__init__, 在新建方法的时候,都会调用到这两个方法:

不止有魔术方法,还有魔术属性,形如"__yyy__",通常是python自动设置的属性,我们可以使用这些属性,比如:

什么使用str方法,什么时候用repr方法?

如果我们想让print打印出来好看,可以定义__str__的方法:

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

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

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

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

__len__(): 返回元素的数量

【注释】只要实现了 __getitem__ 和 __len__ 方法,就会被认为是序列。

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

这个方法应该以与键相关联的方式存储值,以便之后能够使用 __setitem__ 来获取。当然,这个对象可变时才需要实现这个方法。

举个栗子:

定义一副扑克牌(不包括大小王),对牌进行洗牌,然后发牌。

Output:

【注意】 :我们会发现output中,输出了: slice(1, 3, None) ,下面给出解释。

语法:

参数说明:

slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。

举两个栗子来看看:

Output:

切片原理

output

(程序员必会的 hhhhh.....)

看看slice在python3.7中是怎么描述的: