class TT: def __init__(self): print "__init__" def __call__(self): print "__call__" def __str__(self): return "__str__" def __int__(self): return "__int__" def __add__(self,other): return "__add__" def __sub__(self,other): return "__sub__" def __mul__(self,other): return "__mul__" def __div__(self,other): return "__div__"
def __del__(self): print "析构函数被调用"
在Python中,定义一个类TT如上,那么
- 执行 obj = TT()方法,将自动调用TT中的 __init__ 方法
- 在执行obj() 或者TT()(),即类成员后加括号方式调用,则会自动调用 __call__ 方法
- 如果要将对象转换为int类型,即ret = int(obj)则会自动调用类的 __int__ 方法,并将返回值赋值给左边变量
- 同样如果需要将对象转换为str类型,即ret = str(obj)则会自动调用类的 __str__方法,并将返回值赋值给左边变量
- 调用print(obj)方法,等同于调用print(str(obj))方法,最终也会调用到类的 __str__方法
- 两个对象相加时候,则会自动调用第一个对象的 __add__方法,并将第一个个对象当做参数传入这个方法中,同理还有 __sub__、__mul__、__div__
- 析构函数,即__del__,在对象销毁的时候自动调用
- obj.__dict__,会将obj对象中的成员以词典方式展示出来;TT.__dict__会将类中的成员以词典方式展示出来
- 如果想要像列表那样通过li[0]、li[1] = 10、del li[0]的方式访问自己定义的类,需要分别实现__getitem__,__setitem__、__delitem__
def __getitem__(self,item): return XXX def __setitem__(self,item,value) pass def __delitem__(self,item): pass
如下所示:
obj = TT() # __init__ obj() # __call__ print(int(obj)) # __int__ print(str(obj)) # __str__ print(obj) # __str__ print(obj+50) # __add__ print(obj-50) # __sub__ print(obj*50) # __mul__ print(obj/50) # __div__ del obj # 析构函数被调用
对于python中可迭代对象,执行for循环时候,内部执行逻辑:
- 调用可迭代对象的__iter__方法,并获取其返回值
- 循环上一步获取的值
因此,如果需要我们自定义的对象可迭代,则需要实现__iter__(返回值需要为可迭代对象)。