python 常用魔术方法详解

发布于 更新于

技术文章测试开发

前言:在看python源码的过程中我们会经常看到一些特殊方法,也就是双下划线方法。其实双下划线方法是特殊方法,是由python解释器提供的具有特殊意义的方法,主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究

前言:在看python源码的过程中我们会经常看到一些特殊方法,也就是双下划线方法。其实双下划线方法是特殊方法,是由python解释器提供的具有特殊意义的方法,主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下划线方法,更有益于我们阅读源码。今天我们就来看看常用的双下划线方法到底是干什么的。

  1. __init_()

     1、代码演示
     class Demo:
         def __init__(self, name, age):
             self.name = name
             self.age = age
             print("姓名:",self.name)
             print("年龄:",self.age)
    
     if __name__ == '__main__':
         cl = Demo("狗子", 22)
     输出:
     姓名: 狗子
     年龄: 22
     2、总结
        1、触发方式,类实例化的时候自动调用。
        2、作用,用于创建实例属性。
  2. __new__()

     1、代码演示
     class Demo:
         def __init__(self):
             print("如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行")
             print("如果不在__new__方法里面调return创建好的对象,__init__不会被执行")
         def __new__(cls, *args, **kwargs):
             print("__new__方法通过调用object类的__new__方法创建对象,再把对象传递给__init__方法")
             return super().__new__(cls,*args,**kwargs)
     if __name__ == '__main__':
         cl = Demo()
     输出:
     __new__方法通过调用object类的__new__方法创建对象,再把对象传递给__init__方法
     如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行
     如果不在__new__方法里面调return创建好的对象,__init__不会被执行
     2、总结
        1、触发方式,实例化类的时候自动调用。
        2、作用,创建类实例。
        2、__new__()方法执行顺序在__init()之前。
        3、如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行。
        4、如果不在__new__方法里面调return创建好的对象,__init__不会被执行。
  3. __call__()

     1、代码演示
     class Demo:
         def __init__(self):
             print("初始化方法在类实例化的时候执行")
         def __call__(self):
             print("将类实例当做函数调用的时候触发__call__方法")
     if __name__ == '__main__':
         cl = Demo()
         cl()
     输出:
     初始化方法在类实例化的时候执行
     将类实例当做函数调用的时候触发__call__方法
     2、总结
        1、触发方式,将类实例像调函数一样调用的时候自动调用。
        2、作用,让类实例可以像调函数一样调用。
        3、构造方法__new__的执行是由创建对象触发的,即:对象 = 类名() 。
        4、对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
  4. __len__()

     1、代码演示
     class Demo:
         def __init__(self, name, age):
             self.name = name
             self.age = age
    
         def __len__(self):
             return len(self.__dict__)
    
     if __name__ == '__main__':
         cl = Demo("狗子", 22)
         print(len(cl))
     输出:2
     2、总结
        1、触发方式,调用len()函数的时候自动化调用。
        2、作用,计算对象的长度。
  5. __del__()

     1、代码演示
     class Demo:
         def __del__(self):
             print("你别过来,我怕猪......")
     if __name__ == '__main__':
         cl = Demo()
     2、总结
        1、触发方式,对象在内存中被释放时,自动触发执行。
        2、此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以__del__()的调用是由解释器在进行垃圾回收时自动触发执行的。
  6. __str__()

     1、代码演示
     class Demo:
         def __init__(self):
             pass
         def __str__(self):
             print("操作类实例的时候自动化调用__str__")
             return "seccess"
     if __name__ == '__main__':
         cl = Demo()
         print(cl)
     输出:
     操作类实例的时候自动化调用__str__
     seccess
     2、总结
        1、触发方式,操作类实例的时候自动调用。
        2、作用,用于操作类实例的时候返回指定的数据。
  7. __repr__()

     1、代码演示
     class Demo:
         def __repr__(self):
             return "与__str__功能一样"
     if __name__ == '__main__':
         cl = Demo()
         print(cl)
     输出:
     与__str__功能一样
     2、代码演示
     class Demo:
         def __str__(self):
             return "当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__"
         def __repr__(self):
             return "与__str__功能类似"
     if __name__ == '__main__':
         cl = Demo()
         print(cl)
     输出:
     当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__
     3、总结
        1、触发方式,操作类实例的时候自动调用。
        2、作用,与__str__()类似
        3、当同一个类中__str__与__repr__同时存在,__str__优先级高于__repr__。
  8. __eq__()

     1、代码演示
     class Demo:
         def __init__(self):
             self.num1 = 10
             self.num2 = 20
         def __eq__(self,obj):
             print(self.num1)
             print(obj.num2)
             return self.num1 == obj.num2
     if __name__ == '__main__':
         clA = Demo()
         clB = Demo()
         print(clA == clB )
     输出:
     10
     20
     False
     2、总结
        1、触发方式,调用相等判断的时候自动调用。
        2、作用,用于数据相等判断
  9. __hash__()

     1、代码演示
     class Demo:
         def __init__(self,name,age):
             self.name = str(name)
             self.age = str(age)
         def __hash__(self):
             return hash(self.name+self.age)
     if __name__ == '__main__':
         cl = Demo("狗子",20)
         print(hash(cl))
     输出:
     1935947926878097268
     2、总结
        1、触发方式,调用hash()方法时自动调用
        2、作用,计算哈希值
        3、只有不可变数据类型才有哈希值。
  10. __getitem__()

     1、代码演示
     class Demo:
         def __init__(self,name):
             self.name=name
         def __getitem__(self, item):
             print("执行obj[key]获取实例属性的时候触发__getitem__方法")
             return self.__dict__[item]
    
     if __name__ == '__main__':
         cl = Demo("狗子")
         print(cl["name"])
     输出:
     执行obj[key]获取实例属性的时候触发__getitem__方法
     狗子
     2、总结
        1、触发方式,执行obj[key]获取实例属性的时候自动调用。
        2、作用,用于返回属性值。
  11. __setitem__()

     1、代码演示
     class Demo:
         def __init__(self,name):
             self.name=name
         def __setitem__(self, key, value):
             print("执行obj[key]=value的时候触发__setitem__方法")
             self.__dict__[key]=value
     if __name__ == '__main__':
         cl = Demo("狗子")
         cl["age"] = 20
         print(cl.__dict__)
     输出:
     执行obj[key]=value的时候触发__setitem__方法
     {'name': '狗子', 'age': 20}
     2、总结
        1、触发方式,执行obj[key]=value的时候自动调用。
        2、作用,用于设置对象属性。
  12. __delitem__()

     1、代码演示
     class Demo:
         def __init__(self,name):
             self.name=name
         def __setitem__(self, key, value):
             print("执行obj[key]=value的时候触发__setitem__方法")
             self.__dict__[key]=value\
    
         def __delitem__(self, key):
             print('执行 del obj[key]时触发__delitem__')
             self.__dict__.pop(key)
     if __name__ == '__main__':
         cl = Demo("狗子")
         cl["age"] = 20
         print(cl.__dict__)
         del cl["age"]
         print(cl.__dict__)
     输出:
     执行obj[key]=value的时候触发__setitem__方法
     {'name': '狗子', 'age': 20}
     执行 del obj[key]时触发__delitem__
     {'name': '狗子'}
     2、总结
        1、触发方式,执行del obj[key]时自动调用。
        2、作用,用于删除对象属性。
  13. __delitem__()

     1、代码演示
     class Demo:
         def __init__(self,name):
             self.name=name
         def __setitem__(self, key, value):
             print("执行obj[key]=value的时候触发__setitem__方法")
             self.__dict__[key]=value
         def __delattr__(self, item):
             print('执行 del obj.key时候执行__delattr__')
             self.__dict__.pop(item)
     if __name__ == '__main__':
         cl = Demo("狗子")
         cl["age"] = 20
         print(cl.__dict__)
         del cl.age
         print(cl.__dict__)
     2、总结
        1、触发方式,执行del obj.key时候自动调用
        2、作用,用于删除对象属性。

来源:testingpai

继续阅读