Python的特殊方法
2017-08-31 21:44
197 查看
最近在阅读流畅的Python,看到了Python中的特殊方法,写一下自己的总结。
特殊方法的存在是给Python解释器调用的,你自己并不需要调用他们,也就是说没有my_objects.__len__()这种写法,而应该使用len(my_objects)。在执行len(my_objects)的时候,如果my_objects是一个自定义的类的对象。那么你应该重写__len__()方法,之后调用len(my_objects)的时候,Python解释器会调用你重写的__len__方法。
Python中有一种内置的函数repr,他能把一个对象用字符串来表示,类似于Java的object基类中的toString()方法,在Python中就是__repr__()方法,当我们自定义一个类时,重写__repr__()方法,我们调用这个方法就可以这样:
__repr__和__str__的区别在于,后者是在str()函数被调用,或是在使用print函数打印一个对象的时候才被调用,并且他返回的字符串对用户更加友好,如果你只想实现这两个特殊方法中的一个,__repr__是更加友好的选择。因为如果一个对象没有__str__函数,而Python又需要调用他的时候,解释器会用__repr__作为替代,如下面一个程序:
当我们使用映射对象时,比如dict,一个键值对映射类型,有时我们要获得一个key所对应的value,我们使用getitem(key)方法,如果key不存在,解释器就会调用__missing__()方法。
特殊方法的存在是给Python解释器调用的,你自己并不需要调用他们,也就是说没有my_objects.__len__()这种写法,而应该使用len(my_objects)。在执行len(my_objects)的时候,如果my_objects是一个自定义的类的对象。那么你应该重写__len__()方法,之后调用len(my_objects)的时候,Python解释器会调用你重写的__len__方法。
1常见的特殊方法
一些常见的内置类型对象比如list,str,bytearray,当需要执行__len__方法时,CPython会抄一个近路,__len__方法实际上会直接返回PyVarObject里的ob_size这个属性。Python使用C重写过,以上的三种内置对象其实是一个结构体,获取list的长度解释器只需要获取结构体中的size属性即可,所以速度会非常的快。Python中有一种内置的函数repr,他能把一个对象用字符串来表示,类似于Java的object基类中的toString()方法,在Python中就是__repr__()方法,当我们自定义一个类时,重写__repr__()方法,我们调用这个方法就可以这样:
class test: def __repr__(self): return "this is test object" o = test() print(repr(o))程序的运行结果就是打印出一个字符串,如果一个自定义类没有重写__repr__()方法,当执行repr()方法时会打印出这个对象的引用字符串,比如如下程序
class test: def test(self): print(" ") o = test() print(repr(o))最终打印出来是<__main__.test object at 0x1019788d0>
__repr__和__str__的区别在于,后者是在str()函数被调用,或是在使用print函数打印一个对象的时候才被调用,并且他返回的字符串对用户更加友好,如果你只想实现这两个特殊方法中的一个,__repr__是更加友好的选择。因为如果一个对象没有__str__函数,而Python又需要调用他的时候,解释器会用__repr__作为替代,如下面一个程序:
class test: def __repr__(self): return "this is test object" o = test() print(o)程序运行结果与第一次运行结果相同。
当我们使用映射对象时,比如dict,一个键值对映射类型,有时我们要获得一个key所对应的value,我们使用getitem(key)方法,如果key不存在,解释器就会调用__missing__()方法。
1.2其他的常用特殊方法
相关文章推荐
- python 函数是可调用对象和特殊方法__call__
- python中的用来定制类的特殊方法的含义
- python特殊属性和方法的运用
- python对象特殊方法列表
- python 教程 第十三章、 特殊的方法
- python 特殊方法实例
- Python所有特殊方法, 魔术方法, 钩子
- Python类,特殊方法, __getitem__,__len__, __delitem__
- 浅谈Python类的__getitem__和__setitem__特殊方法
- python特殊方法定制类
- Python 对象特殊方法:(一)对象创建与销毁
- 实例解析Python中的__new__特殊方法
- python的特殊方法:
- Python深入01 特殊方法与多范式
- Python(私有变量)类中的特殊方法
- Python深入学习之特殊方法与多范式
- Python学习29:使用特殊的方法定制类(类似于c++的运算符重载)
- python 新式类的学习随笔-定制类的特殊方法(2)
- Python学习笔记(二)——特殊方法(续)
- Python学习笔记——特殊方法