魔术函数python 魔术函数作用

Python中常见魔法方法介绍魔法方法(Magic Methods)是Python中的内置函数,一般以双下划线开头和结尾,例如__init__、__del__等 。之所以称之为魔法方法,是因为这些方法会在进行特定的操作时会自动被调用 。
在Python中,可以通过dir()方法来查看某个对象的所有方法和属性 , 其中双下划线开头和结尾的就是该对象的魔法方法 。以字符串对象为例:
可以看到字符串对象有__add__方法,所以在Python中可以直接对字符串对象使用" "操作 , 当Python识别到" "操作时,就会调用该对象的__add__方法 。有需要时我们可以在自己的类中重写__add__方法来完成自己想要的效果 。
【魔术函数python 魔术函数作用】我们重写了__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):当容器可以执行 for x in container:,或者使用iter(container)时,需要定义该方法
下面举一个例子,实现一个容器,该容器有List的一般功能,同时增加一些其它功能如访问第一个元素,最后一个元素,记录每个元素被访问的次数等 。
这类方法的使用场景主要在你需要定义一个满足需求的容器类数据结构时会用到,比如可以尝试自定义实现树结构、链表等数据结构(在collections中均已有),或者项目中需要定制的一些容器类型 。
魔法方法在Python代码中能够简化代码,提高代码可读性,在常见的Python第三方库中可以看到很多对于魔法方法的运用 。
因此当前这篇文章仅是抛砖引玉,真正的使用需要在开源的优秀源码中以及自身的工程实践中不断加深理解并合适应用 。
【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魔法函数(特殊函数) Python中如何实现运算符的重载魔术函数python,即实现例如a b这样的运算符操作呢魔术函数python?
在C中可以使用 operator 关键字实现运算符的重载 。但是在Python中没有类似这样的关键字魔术函数python,所以要实现运算符的重载,就要用到Python的魔法函数 。Python魔法函数是以双下划线开头 , 双下划线结尾的一组函数 。魔术函数python我们在类定义中最常用到的 __init__ 函数就是这样一个魔法函数,它在创建类对象时被自动调用 。
下面我们来看个简单的例子 。
上述代码示例了几个魔法函数的用法 。__add__函数对应了二元运算符 ,当执行a b语句时,python就会自动调用a.add(b) 。对于上述例子中的v1 v2 v3,则相当于调用了(v1.add(v2)).add(v3) 。
代码中还有一个在Python类定义经常使用的__str__函数,当使用str()时会被调用 。print函数对传入的参数都调用了str()将其转换成易读的字符串形式,便于打印输出,因而会调用类定义的__str__函数打出自定义的字符串 。
代码中还有一个特殊的__call__函数 , 该函数在将对象采用函数调用方式使用时被调用, 例如v1()相当于v1.call() 。
以上就是魔法函数的基本使用方法 。常见的魔法函数我们可以使用dir()函数来查看 。
输出结果为魔术函数python:
上述结果中形式为‘__函数名__’的函数为魔法函数 , 注意有些对象也是这种形式,例如__class__, __module__等, 这些不是魔法函数 。具体的魔法函数说明可以参考Python官方说明文档 。
以上代码在Python3.6运行通过.
python编程:魔术方法 首先,你一定用过魔术方法 , 也一定见过魔术方法 。以下划线开头的方法,比如:
这些被统称为魔术方法 。
给整数和字符串做加法:
我们写个表示城市的类,它有两个属性:城市名和人口 。
然后我们给两个城市做加法,发现不能相加:
报错是说City不支持" "号 , 如何让它支持" "呢?需要给类加上魔术方法__add__就可以相加了 。
我们给City添加一个__add__的方法,城市相加,人口相加,创建一个新的城市:
这说明__add__有一定的魔力,当我们用到加号" "时,python就回去寻找这个方法,如果这个对象没有这个方法就会报错 。
python中 , 所有的运算符都是通过魔术方法来实现的 。
如果我们在City类有以下方法,就可以做加减乘除了:
我们再来打印int和str查看他们的方法,int有加减乘除 , str只有__add__ __mul__,它只能做加法和乘法:
列表为什么能获取元素, __getitem__,可以再任何一个类里加上这个方法,然后也就可以用[]方括号来获取元素:
我们使用最多的方法一定是__new__和__init__, 在新建方法的时候,都会调用到这两个方法:
不止有魔术方法,还有魔术属性,形如"__yyy__",通常是python自动设置的属性,我们可以使用这些属性 , 比如:
什么使用str方法,什么时候用repr方法?
如果我们想让print打印出来好看,可以定义__str__的方法:
python:matplotlib,魔法函数%matplotlib notebook,plot里style='k--o'是什么意思呢?知乎自己看网页链接:
matplotlib的plot函数接受一组X和Y坐标,还可以通过color、marker和linestyle关键字传入指定的颜色、标记和线型,或者用一个表示颜色、标记和线型的格式字符串替代,两种方法是等效的 。格式字符串中color、marker和linestyle可以任意排列 , 如'ko--','k--o' , 'o--k'
魔术函数python的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于魔术函数作用、魔术函数python的信息别忘了在本站进行查找喔 。

    推荐阅读