
在看 python 源码的过程中我们会经常看到一些特殊方法,也就是双下划线方法。其实双下划线方法是特殊方法,是由 python 解释器提供的具有特殊意义的方法,主要是 python 源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下划线方法,更有益于我们阅读源码。今天我们就来看看常用的双下划线方法到底是干什么的。 |
前言
-
__init_()
1、代码演示class Demo:def __init__(self, name, age):self.name = nameself.age = ageprint("姓名:",self.name)print("年龄:",self.age)if __name__ == '__main__':cl = Demo("狗子", 22)输出:姓名:狗子年龄:222、总结1、触发方式,类实例化的时候自动调用。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__不会被执行。 -
_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__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() -
__len__(
1、代码演示class Demo:def __init__(self, name, age):self.name = nameself.age = agedef __len__(self):return len(self.__dict__)if __name__ == '__main__':cl = Demo("狗子", 22)print(len(cl))输出:22、总结1、触发方式,调用len()函数的时候自动化调用。2、作用,计算对象的长度。 -
__del__()
1、代码演示class Demo:def __del__(self):print("你别过来,我怕猪......")if __name__ == '__main__':cl = Demo()2、总结1、触发方式,对象在内存中被释放时,自动触发执行。2、此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以__del__()的调用是由解释器在进行垃圾回收时自动触发执行的。 -
__str__()
1、代码演示class Demo:def __init__(self):passdef __str__(self):print("操作类实例的时候自动化调用__str__")return "seccess"if __name__ == '__main__':cl = Demo()print(cl)输出:操作类实例的时候自动化调用__str__seccess2、总结1、触发方式,操作类实例的时候自动调用。2、作用,用于操作类实例的时候返回指定的数据。 -
__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__。 -
__eq__()
1、代码演示class Demo:def __init__(self):self.num1 = 10self.num2 = 20def __eq__(self,obj):print(self.num1)print(obj.num2)return self.num1 == obj.num2if __name__ == '__main__':clA = Demo()clB = Demo()print(clA == clB )输出:1020False2、总结1、触发方式,调用相等判断的时候自动调用。2、作用,用于数据相等判断 -
__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))输出:19359479268780972682、总结1、触发方式,调用hash()方法时自动调用2、作用,计算哈希值3、只有不可变数据类型才有哈希值。 -
__getitem__()
1、代码演示class Demo:def __init__(self,name):self.name=namedef __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、作用,用于返回属性值。 -
__setitem__()
1、代码演示class Demo:def __init__(self,name):self.name=namedef __setitem__(self, key, value):print("执行obj[key]=value的时候触发__setitem__方法")self.__dict__[key]=valueif __name__ == '__main__':cl = Demo("狗子")cl["age"] = 20print(cl.__dict__)输出:执行obj[key]=value的时候触发__setitem__方法{'name': '狗子', 'age': 20}2、总结1、触发方式,执行obj[key]=value的时候自动调用。2、作用,用于设置对象属性。 -
__delitem__()
1、代码演示class Demo:def __init__(self,name):self.name=namedef __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"] = 20print(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、作用,用于删除对象属性。
-
__delitem__()
1、代码演示class Demo:def __init__(self,name):self.name=namedef __setitem__(self, key, value):print("执行obj[key]=value的时候触发__setitem__方法")self.__dict__[key]=valuedef __delattr__(self, item):print('执行 del obj.key时候执行__delattr__')self.__dict__.pop(item)if __name__ == '__main__':cl = Demo("狗子")cl["age"] = 20print(cl.__dict__)del cl.ageprint(cl.__dict__)2、总结1、触发方式,执行del obj.key时候自动调用2、作用,用于删除对象属性。

