python-魔术方法-不止于python
魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发。
1.__new__魔术方法
触发时机:实例化对象的过程当中触发
功能:根据事情情况决定是否产生对象!
参数:一个cls接收当前类,其余根据需求决定(new魔术方法的参数和init的参数一样)
返回值:可有可无
例:
1 | class Human(object): |
2.__init__魔术方法
触发时机:实例化对象后初始化对象的时候自动触发
功能:对对象进行成员属性的设定(成员归于对象所有)
参数:有一个self接收当前对象,其余根据需求决定!
返回值:不需要
例:
1 | class Human: #定义类的时候可以不加(object),程序默认就加上了 |
结果为:
1 | init方法执行了 |
__new__和__init__魔术方法的区别:http://www.cnblogs.com/ifantastic/p/3175735.html
3.__del__魔术方法
触发时机:当对象从内存中被移除的时候自动触发(1.系统回收所有资源,页面结束 2.所有该对象的变量都被删除的时候!)!
功能:回收系统资源
参数:一个self接收当前对象
返回值:无
例:
1 | class Human: |
结果为:
1 | del魔术方法被触发! |
注意:如果把删除的那两条语句注释或者不写,__del__魔术方法还是会执行:结果为:
1 | ------------------------- |
这是因为:如果没有对象从内存中删除,一个程序执行完成后,会自动回收资源,就会触发__del__魔术方法
4.__call__魔术方法
触发时机:将对象当作函数调用时自动触发时机
功能:代替一个方法的名称,为操作提供快捷方式
参数:一个self接收当前对象,其余根据需求决定
返回值:可有可无
例:
1 | class Num(object): |
结果为:
—-call方法被触发—–
—-run—–
None #这是因为run()方法中没有返回值 加个return就好了
5.__str__魔术方法
触发时机:使用print()打印对象的时候或者使用str()转换对象的时候自动触发
功能:设置对象打印时候的值
参数:一个self接收当前对象
返回值:必须是字符串类型!
例:
1 | class Num(object): |
结果为:
1 | 这是一个类 |
6.__repr__魔术方法
触发时机:使用repr()操作对象时候自动触发
功能:设置repr()操作对象的返回结果
参数:一个self接收当前对象
返回值:必须是字符串
例:
1 | class Num(object): |
结果为:
1 | ------repr被调用------ |
7.__len__魔术方法
触发时机:使用len检测对象的时候自动触发.
功能:计算某个事物的长度
参数:一个self接收当前对象
返回值:必须是一个整数
例:
1 | class Num(object): |
结果为:
1 | len魔术方法被触发 |
8.__bool__魔术方法
触发时机:使用bool转换对象的时候自动触发
功能:检测成员的状态
参数:一个self接收当前对象
返回值:必须是布尔类型
1 | class Num(object): |
结果为:
1 | bool魔术方法被触发 |
9.__format__魔术方法
触发时机:使用format操作对象的时候自动除法
功能:定义format操作对象的方式
参数:一个self接收当前对象,一个形参接收format的限定符号
返回值:必须是字符串!
例:
1 | class Num(object): |
结果为:
1 | format魔术方法被触发 |
其他的魔术方法就不常用了,这里就不一一介绍了,使用方法都大同小异,如有错误,欢迎交流