python类中几个特殊方法

时间:2022-08-18 19:55:24
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循环时候,内部执行逻辑:

  1. 调用可迭代对象的__iter__方法,并获取其返回值
  2. 循环上一步获取的值

因此,如果需要我们自定义的对象可迭代,则需要实现__iter__(返回值需要为可迭代对象)。