Python 魔法方法解析

作者&投稿:盖凤 (若有异议请与网页底部的电邮联系)
~ 前言在Python语言中,一切皆为对象,因此Python是支持面向对象的高级编程语言。在Python面向对象编程特性一文中,Python语言是支持封装、继承、多态三个特性的。
封装:使用黑盒的方式将对象信息隐藏在内部,外部无法进行访问继承:子父类概念,将父类称为基类,子类可以继承所有父类的特性,极大地提高代码的复用性多态:指向同一个方法,不同对象产生行为是不同的。继承和方法重写是多态的两个前提
在创建类的时候,我们总会调用系统以__双下换线开头结尾的方法,来对对象进行创建、初始化、销毁等操作,如以下栗子:
classStudent:def__init__(self,name,age):self.name=nameself.age=agedef__del__(self):print(系统销毁对象{0}.format(self))代码在上述栗子中,我们都知道__init__()是构造方法、__del__()是析构方法,__new__()创建实例对象,除此之外它们还有一个统一的名称叫做魔法方法。
本期,我们将学习Python中拥有一个很帅气的名称魔法方法,Letsgo~~
1.魔法方法概述什么叫魔法方法?
在Python中,定义以__双下划线开头结尾的方法,行内内部大家都统称为“magicmethod”。
比如我们常见的构造方法、析构方法都是属于魔法方法中。
在Python官方文档中,魔法方法分布比较分散,并且介绍时也无案例说明,通常晦涩难懂。
魔法方法的特点魔法方法主要定义类对象的方法,无法直接调用默认情况,Python解释器会自动调用。特殊情况,可重写该方法。魔法方法可用于对象初始化、控制属性访问、创建自定义等操作魔法方法包提供包含如比较、数值计算、单双目运算、类型转换等方法2.构造销毁方法
我们上述创建一个Student类,定义一个实例化类StudentA,看看Python解释器内部会分别调用三个魔法方法。
__new__():是对象实例化时,首先会调用该方法,创建实例,并把类参数name,age传给__init__()。如果__new__()未返回一个类实例,则__init__()方法将不执行。__init__():在__new__()创建实例后,对实例化参数进行初始化赋值。因为,对象是由__new__()创建和__init__()定制,共同构建完成的,__init__()返回值为None,否则在运行时会引发TypeError.__del__():在实例对象比销毁时被调用。对象被垃圾回收时才会调用该方法,需要注意的是Python解释器退出时,但对象仍然存活的时候,__del__()不会被执行的。如在程序中需要销毁对象,建议尽量手工调用del()方法进行清理。3.属性访问方法
Python魔法方法提供控制属性访问的方法。
__getattr__(self,name):该方法用于访问对象不存在的属性时,会调用定义访问行为。这个方法适合于普通的拼写错误的获取和重定向,对获取不建议的属性时会给出警告或者处理一个AttributteError。__setattr__(self,name,value):是封装属性,无论属性是否存在,都允许定义对属性的赋值行为,可以对属性的值进行个性化定义。在使用__setattr__(self,name,value)时,需要避免无限递归的错误。__delattr__():与__setattr__(self,name,value)类似,但是不对属性进行赋值而是进行删除。该方法仅在delobj.name对于对象有意义时才被实现。同样在实现时,需要避免无限循环的错误。4.上下文管理器
Python中对文件打开、关闭操作。提供了with语句,其实质就是运行上下文管理器,由三部分组成。
上下文管理协议上下文管理器上下文运行时
以上三部分,其中上下文管理协议是由__enter__()和__exit__()两个方法相互协作完成的。
__enter__():进入运行时上下文并返回此对象关联到该运行时上下文的其他对象上。__enter__()该方法的返回值会绑定到使用上下文管理器with语句的as子句中的标识符。__exit__():退出运行时上下文并返回一个bool标识的异常是否应当被屏蔽。当with语句体重发生异常,则参数会包含异常类型、值和回溯信息,否则三个参数都是None。5.对象描述器
python魔法方法提供了描述器,是可以通过获取、设置以及删除时访问类。
描述器不是独立的,需要被所有者持有,并且存在其字典中当创建面向对象的数据库或者类,里面包含相互依赖的属性时,描述器将会非常有用的实现描述器时,一个类至少有__get__()、__set__()、__delete__()方法
__get__(self,instance,owner):定义描述器的值被取得时的行为。instance是拥有该描述器对象的一个实例。owner拥有者本身
__set__(self,instance,value):定义描述器的值被改变时的行为。instance为描述器的一个实例,value要设置的值。
__delete__(self,instance):定义描述器的值被上传时的行为,instance为描述器的一个实例。
6.其他方法比较操作符魔法方法:
方法
说明
__cmp__(self,other)
比较方法里最基本的魔法方法
__eq__(self,other)
定义相等符号,==
__ne__(self,other)
定义不等于符号,!=
__lt__(self,other)
定义小于符号,
__gt__(self,other)
定义大于符号,
__le__(self,other)
定义小于等于符号,=
__ge__(self,other)
定义大于等于符号,=
____(self)
____(self)
单目操作符魔法方法:
方法
说明
__pos__(self)
实现取正操作
__neg__(self)
实现取负操作
__adbs__(self)
实现绝对值操作
__invert__(self)
实现取反操作
__round__(self,n)
实现内建函数
__floor__(self)
实现向下取整
__ceil__(self)
实现向上取整
__trunc__(self)
实现距离零最近的的整数
总结
本期,主要对Python魔法方法进行详细的学习。在日常工作,我们可以使用Python魔法方法方便我们快速进行面向对象编程。
以上是本期内容,欢迎大佬们点赞评论,下期见~
作者:盆友圈的小可爱链接:https://juejin.cn/post/7063686311000948772


平武县18884119795: python中的魔法方法有了解哪些 -
牛胡丙酸: 问的太笼统了,不知道答的对不对. 看下面的图 左边元类,中间类,右边实例 其实记住的只是一点:python里一切都是对象,实例是对象,类是对象,元类也是对象. 这里题主说的类和对象其实是包含和被包含的关系了. 那么Python里的类和其他的对象有什么区别? 实例是对象,因为创建实例的是类.类是对象,创建类的是什么呢?Python给的答案就是元类.你可以通过type()函数来查看它的元类.(type(type)得到的是它自己) 其实这个类和其他对象一样,所以我们就不惊讶它为什么有类方法,类变量了..

平武县18884119795: Python的二元算术运算详解
牛胡丙酸: 相关学习推荐:python教程大家对我解读属性访问的博客文章反应热烈,这启发了我再写一篇关于 Python 有多少语法实际上只是语法糖的文章.在本文中,我想谈谈二元...

平武县18884119795: Python有哪些黑魔法 -
牛胡丙酸: 打开python shell 试试 import antigravity

平武县18884119795: 求大神讲解下PYTHON魔法的到底有什么意义? -
牛胡丙酸: 魔法方法是让你自己改的 不改当然没意义了 初学者说

平武县18884119795: 如何用Python解析Json文件 -
牛胡丙酸: 更多的信息,可以参考python内部的json文档:python>>> help(json) 或者官方文档:http://docs.python.org/library/json.html#module-json 下面给出一个使用python解析json的简单例子:#!/usr/bin/python import json#Function:Analyze json script#...

平武县18884119795: 魔术方法 python 何时调用 -
牛胡丙酸: class FileObject: '''给文件对象进行包装从而确认在删除时文件流关闭''' def __init__(self, filepath='~', filename='sample.txt'): #读写模式打开一个文件self.file = open(join(filepath, filename), 'r+') def __del__(self): self.file.close() del self.file

平武县18884119795: python中方法和函数的区别是什么?什么时候要带self? -
牛胡丙酸: 你的问题本身就有问题,方法其实就是函数只不过他在类里面叫他为方法,你应该看的是类的定义与函数的区别,class是类,他里面的self是表示通过类生成的对象

平武县18884119795: 用python解析XML格式的字符串 -
牛胡丙酸: 你这样的数据还没有用正则来的简单r'用XML会比较麻烦:dom1 = minidom.parseString(xml)result = dom...

平武县18884119795: python 3.5中 为什么无法重写魔法方法 -
牛胡丙酸: 可以写呀,如下12345678 classNew_int(int): def__add__(self,other): returnint.__sub__(self,other) def__sub__(self, other): returnint.__add__(self,other) a=New_int(3) b=New_int(5) print(a+b) 你写的是不是少一个_

平武县18884119795: python 什么是magic string -
牛胡丙酸: 无论是python还是其它的编程语言,都有magic string这类东西存在.它并不是phtyon专有的东西.类似的还有magic number这样的.前两年有关linux一个版本的更新就有个关于魔法数字的小插曲:linux一个版本更新出来后,对某个类型的显卡...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网