问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python有多少个魔法方法?

发布网友 发布时间:2024-10-01 19:28

我来回答

1个回答

热心网友 时间:2024-10-12 20:30

导读:很多朋友问到关于python有多少个魔法方法的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

【python】魔法方法:__getitem__、__len__、__setitem__等的使用

在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中是怎么描述的:

Python中常见魔法方法介绍

魔法方法(MagicMethods)是Python中的内置函数,一般以双下划线开头和结尾,例如__init__、__del__等。之所以称之为魔法方法,是因为这些方法会在进行特定的操作时会自动被调用。

在Python中,可以通过dir()方法来查看某个对象的所有方法和属性,其中双下划线开头和结尾的就是该对象的魔法方法。以字符串对象为例:

可以看到字符串对象有__add__方法,所以在Python中可以直接对字符串对象使用"+"操作,当Python识别到"+"操作时,就会调用该对象的__add__方法。有需要时我们可以在自己的类中重写__add__方法来完成自己想要的效果。

我们重写了__add__方法,当Python识别"+"操作时,会自动调用重写后的__add__方法。可以看到,魔法方法在类或对象的某些事件出发后会自动执行,如果希望根据自己的程序定制特殊功能的类,那么就需要对这些方法进行重写。使用魔法方法,我们可以非常方便地给类添加特殊的功能。

1、构造与初始化

__new__、__init__这两个魔法方法常用于对类的初始化操作。上面我们创建a1=A("hello")时,但首先调用的是__new__;初始化一个类分为两步:

a.调用该类的new方法,返回该类的实例对象

b.调用该类的init方法,对实例对象进行初始化。

__new__(cls,*args,**kwargs)至少需要一个cls参数,代表传入的类。后面两个参数传递给__init__。在__new__可以决定是否继续调用__init__方法,只有当__new__返回了当前类cls的实例,才会接着调用__init__。结合__new__方法的特性,我们可以通过重写__new__方法实现Python的单例模式:

可以看到虽然创建了两个对象,但两个对象的地址相同。

2、控制属性访问这类魔法

方法主要对对象的属性进行访问、定义、修改时起作用。主要有:

__getattr__(self,name):定义当用户试图获取一个属性时的行为。

__getattribute__(self,name):定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用getattr)。

__setattr__(self,name,value):定义当一个属性被设置时的行为。

当初始化属性时如self.a=a时或修改实例属性如ins.a=1时本质时调用魔法方法self.__setattr__(name,values);当实例访问某个属性如ins.a本质是调用魔法方法a.__getattr__(name)

3、容器类操作

有一些方法可以让我们自己定义自己的容器,就像Python内置的List,Tuple,Dict等等;容器分为可变容器和不可变容器。

如果自定义一个不可变容器的话,只能定义__len__和__getitem__;定义一个可变容器除了不可变容器的所有魔法方法,还需要定义__setitem__和__delitem__;如果容器可迭代。还需要定义__iter__。

__len__(self):返回容器的长度

__getitem__(self,key):当需要执行self[key]的方式去调用容器中的对象,调用的是该方法

__setitem__(self,key,value):当需要执行self[key]=value时,调用的是该方法

__iter__(self):当容器可以执行forxincontainer:,或者使用iter(container)时,需要定义该方法

下面举一个例子,实现一个容器,该容器有List的一般功能,同时增加一些其它功能如访问第一个元素,最后一个元素,记录每个元素被访问的次数等。

这类方法的使用场景主要在你需要定义一个满足需求的容器类数据结构时会用到,比如可以尝试自定义实现树结构、链表等数据结构(在collections中均已有),或者项目中需要定制的一些容器类型。

魔法方法在Python代码中能够简化代码,提高代码可读性,在常见的Python第三方库中可以看到很多对于魔法方法的运用。

因此当前这篇文章仅是抛砖引玉,真正的使用需要在开源的优秀源码中以及自身的工程实践中不断加深理解并合适应用。

python编程:魔术方法

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

这些被统称为魔术方法。

给整数和字符串做加法:

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

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

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

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

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

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

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

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

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

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

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

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

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

结语:以上就是首席CTO笔记为大家介绍的关于python有多少个魔法方法的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见死人活了腿上都是浓泡? 佛山市南海区里水镇怎么坐车去广东省广州市白云区同和镇元下田福泰... 电加热宝加水要注意什么? 电热宝如何放气 谁知道静雅思听中《寻访二战德国兵02:保卫祖国》的背景音乐 为什么我的ios8.02要1.7G? 华硕游戏笔记与普通笔记本有什么区别 朴智妍荣誉记录 朴智妍艺术贡献的电影 5升级Ios8.0.2怎么样 Python里最神秘的一个魔法函数! 盛宣怀藏书编书 盛宣怀档案南洋公学建立 盛宣怀实业建功 python中常见的魔法方法 magic method 盛宣怀档案北洋学堂建立 蜂蜜时间久了还可以食用吗? 如何自制玩具陪孩子玩? 《魔镜传说之爱上异世君王》txt全集下载 新建一个Word文档,编辑结束后,执行'文件'→'保存'命令,则()。_百度... Word的文档里开始的文件怎么保存word的文档里开始的文件怎么保存在桌面... 柿子怎样做柿饼 网上买家具可信度如何 网上买家具便宜吗?靠不靠谱? 自吸离心泵和自吸泵有什么区别? 网上买家具怎么样?谁买过 自吸离心泵价格便宜品质又好的牌子有哪些? 自吸离心泵哪个牌子的好有详细的吗? 想去配个眼镜,亿康眼科配镜配得好吗? ...当红时抛下冯巩移居海外的刘伟,经历过什么? Python:装饰器 python列表list添加元素的三种方法 为什么抖音直播唱歌能赚钱 抖音上唱歌跳舞真的能赚钱吗?属于什么标签? ...一个用厘米波一个用毫米波,运营商同一套基站就行吗? 怎么设置屏幕密码?就是怎样设置电脑桌面密码,离开一会老有人动电脑... 怎么加密码,开着机的情况下,如果有人想动我的电脑,必须输入密码那种 怎样设置才能使设有开机密码的电脑别人开不了机?我的电脑总有人开机,请... 我的电脑老是被人使用,想加个密,可是不知道怎么加.哪位大大能教我? 怎样查询自己的身份证有效性? 夕阳西上彩云间,流水小桥舟竟还,柔柳丝绦抛水面,青山倒影镜中悬,是什么... 夕阳西上彩云间,流水小桥舟竟还,柔柳丝绦抛水里,青山倒影镜中�_百度... ...我怎样才能知道这个身份证的真伪。网上付费查询也是可以的。请说明... 怎样在网上查询个人身份信息真假? 荔枝红茶的功效与作用 喝荔枝红茶的好处 荔枝茶的功效与禁忌 荔枝红茶的功效作用 上海电子警察违章处理流程是怎样的? 浴盐泡澡多久一次 每隔多久可以泡一次浴盐澡 c++中的explicit的作用,为何尽量使用explicit关键字