# -*- encoding: utf-8 -*-
import functools
import time
'''
8、 第4章_魔术方法
关键:
1 魔术方法
含义:用于重载操作符或者内置方法
定义:可以通过__语法定义
语法: 将下划线放到方法名称的两端
钩子: 在特定事件发生时,能够为响应事件而调用的代码,回调函数就是钩子的一种类型
2 可用的魔术方法
2.1 __init__方法
__init__方法没有创建新对象,创建新对象是__new__完成的。
__init__是为创建后的对象提供初始化数据。
2.2 __new__方法
在__init__方法之前执行,用于创建类的实例。
参数:创建实例所需要的类
2.3 __del__方法
在对象被销毁时被调用。
无论时直接删除对象还是垃圾回收器触发,都会调用__del__方法
2.4 __str__
含义: 在对象传递给str的构造函数时被调用
2.5 __unicode__
特点:在对象被传递给unicode构造函数时调用
如果格式化unicode对象时,遇到%s,优先使用__unicode__方法
2.6 __bool__
作用:判定对象是否为True或者False
python2中时__nonzero__方法
2.7 __int__
作用: 将对象转换为数字
2.8 __float__
作用: 将对象转换为浮点数
2.9 __complex__
作用: 将对象转换为复数
2.10 __eq__
作用: 判定两个对象使用 == 操作符号比较时被调用
2.11 __ne__
作用: 在使用!=操作符时使用
2.12 __lt__
作用: <
2.13 __gt__
作用: >
2.14 __le__
作用: <=
2.15 __ge__
作用: >=
3 操作符重载
3.1 二元操作符
对于每个操作符,有3种魔术方法
1) 普通方法: x+y 等提供与 x._add_(y),仅仅返回结果
2) 取反方法: 在第一个操作对象不提供传统方法并且操作对象类型不同时才调用,将操作符两边对象顺序交换
x+y如果x没有定义_add_方法,则调用y._radd_(x)
3) 即席方法: 在操作符即席修改第一个变量时被调用,例如(+=)
x+=y 等同于 x._iadd_(y)
3.2 除法
特点: 向下取整
python2中是__div__方法
python3中是__truediv__方法
3.3 一元操作符
+, - , ~
特点: 只接受一个位置参数self
分别与:
__pos__(与+匹配)
__neg__(与-匹配)
__invert_(与~匹配)
~x等同于x._invert_()
4 重载常见方法
4.1 __len__
作用: 描述对象的长度
参数: 接受位置参数,并返回整型值
4.2 __repr__
作用: 确定对象在Python交互式终端中的显示方式。
也可以用于重构对象的Python表达式
4.3 __hash__
作用: 通过数字化表达式唯一标识对象
参数: 接受位置参数self,并返回整型值
特点: 对象提供了__hash__函数,通常返回该对象的id
4.4 __format__
作用: 根据Python的格式化规范来格式化不同种类的对象
参数: 接受两个位置参数,第一个是self,第二个是格式化规范的字符串
4.5 __instancecheck__
issubclass:检查一个类是否继承自另一个类
5 集合
5.1 __contains__
作用: 判断某个对象是否在一个集合中
参数: 接受参数self和needle,判断needle是否在集合中
5.2 __getitem__
作用: 进行键查找,基本表达式是hatstack[key]
参数: 接受两个参数self和key
5.3 __setitem__
作用: 设置集合中元素的值
参数: self, key, value
5.4 __delitem__
作用: 在使用del关键字时被调用
5.5 __getattr__
作用: 常规方式无法找到属性时才被调用
参数: self, key
5.6 __setattr__
作用: 赋值给一个对西那个时被调用,方法会一直被调用
5.7 __getattribute__
作用: 被无条件调用,只有当__getattribute__发生异常,才会调用__getattr__
参考:
Python高级编程
'''
class DelClass(object):
def __del__(self):
print "I want to be professional at python."
def useDel():
DelClass()
class StrClass(object):
def __str__(self):
return "This is class: {value}".format(
value=self.__class__.__name__)
def useStrMagicMethod():
result = str(StrClass())
print result
class Who(object):
def __str__(self):
return 'string'
def __unicode__(self):
return u'unicode'
def useUnicodeMagicMethod():
info = u"This is %s" % (Who())
print info
info = "This is %s" % (Who())
print info
class InvertString(object):
def __init__(self, s):
self.s = s
def __str__(self):
return self.s
def __invert__(self):
return self.s[::-1]
def useInvertMagicMethod():
word = "I want to be professional at python."
temp = InvertString(word)
result = ~temp
print result
def process():
useDel()
useStrMagicMethod()
useUnicodeMagicMethod()
useInvertMagicMethod()
if __name__ == "__main__":
process()