python的魔法函数
Posted 你没有想象的那么重要
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的魔法函数相关的知识,希望对你有一定的参考价值。
hello, 大家好, 今天给大家分享一点python的魔法函数,即Python中自带双下划线的函数,虽然在大规模的软件开发中大家用的不多,当然除非你想被打(可以秀(装逼)一下), 虽然使用的不多, 但是要是能数量的运用它们的话, 没有点功力基础也是相当困难的, 正所谓没有扎实的基本功,即便南拳北腿,降龙十八掌,九阴白骨爪,乾坤大挪移全部了然于心,照样是花拳绣腿,百无一用
所以还是老老实实的把自己的基本功练好,面向对象玩的炉火纯青,其他的不过是稍加训练,跟卖艺的学几招也能称霸一片天。哈哈 牛吹的太过了, 还是回到正题,总结分享一下一些稍微不太熟悉的魔法方法。
一、__str__():
它表示的是直接打印对象实现的方法,__str__是被print函数调用的, 一般都是返回一个值, 这个值是以字符串方式表现的,需要注意的是必须是返回一个字符串类型的,不然会抛出异常:
这样一来的话在面向对象中我们就可以按照自己的想法去打印我们想要的的结果了。
二、__call__():
对象通过__call__()的方法可以是对象模拟函数的行为,即具体在__call__函数里面定义我们想要的的函数,或者返回传入参数的倍数或者其他拼接的信息等,这样的效果是我们可以像使用函数一样去使用类,也是一件很有意思的事。(嗯, 就像拖鞋不只是用来穿的)
三、__repr__():
与str类似, 但是str用于将值转化为适合人阅读的形式,但是repr转化为的是供解释器读取的形式,区别就是后者在str()函数或者print函数打印一个函数的时候被使用,且它返回的字符串对终端用户更友好,如果只想实现一个,使用repr会更好,因为如果一个对象没有str函数,然而Python又需要调用它的时候,解释器会用repr作为替代去配合调用。常见的用法就是我需要输出一个自己加工的数据的时候,重写这个方法,这样再调用print()或者repr的方法时,就能调出我们期望的数据。
四、__setattr__():
该方法会拦截所有的赋值语句,如果定义了,self.attr = value就会变成self.__setattr__("attr", value), 需要注意的是当在__setattr__方法里边对属性进行赋值的时候,不能使用self.attr = value, 因为会再次调用self.__setattr__("attr", value),导致堆栈溢出。应该使用self.__dict__[\'name\'] = value即对属性字典做索引运算来赋值。
常规对属性赋值被赋值的属性和值会存入实例属性字典__dict__中
如果自定义了__setattr__
,对实例属性的赋值就会调用它。类定义中的self.attr
也同样,所以在__setattr__
下还有self.attr
的赋值操作就会出现无线递归的调用__setattr__
的情况。自己实现__setattr__
有很大风险,一般情况都还是继承object
类的__setattr__
方法。
五、 __getattr__():
拦截点号运算。当对未定义属性名称和实例进行点号运算时,就会用属性,名作为字符串调用这个方法,如果继承树可以找到该属性,则不调用。即当我们实例化一个对象,当某属性可以通过正常机制追溯到即在对象.__dict__中可以找到时,不会调用该方法。
六、__delattr__():
需要注意的是和__setattr__一样,适用于删除对象的某个属性时才用到。
七、__eq__():
用来判断两个对象的值是否相等,"=="会触发这个方法。
如果我们不重写的话,会默认调用object中的__eq__方法, 那个比较严格,有时候不好判断两个对象是否相等, 这个会经常进行重写。
好啦, 今天的魔法方法就分享到这吧,当然还有其他的魔法方法, 比如__class__, __doc__, __name__等其他方法,这些方法都是我们比较常用的,也就没必要小猿在这里再啰嗦一遍,希望能给在Python或者其他语言带来点启发, 你的关注和感悟是小猿我分享知识,继续推送的最大动力。大家一起努力。
以上是关于python的魔法函数的主要内容,如果未能解决你的问题,请参考以下文章