python 常用魔术方法详解

本贴最后更新于 830 天前,其中的信息可能已经事过景迁

前言:在看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作用用于删除对象属性
    
回帖
请输入回帖内容 ...