前言:在看python源码的过程中我们会经常看到一些特殊方法,也就是双下划线方法。其实双下划线方法是特殊方法,是由python解释器提供的具有特殊意义的方法,主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下划线方法,更有益于我们阅读源码。今天我们就来看看常用的双下划线方法到底是干什么的。
-
__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、作用,用于创建实例属性。
-
__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 = 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、作用,计算对象的长度。
-
__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): pass def __str__(self): print("操作类实例的时候自动化调用__str__") return "seccess" if __name__ == '__main__': cl = Demo() print(cl) 输出: 操作类实例的时候自动化调用__str__ seccess 2、总结 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 = 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、作用,用于数据相等判断
-
__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、只有不可变数据类型才有哈希值。
-
__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、作用,用于返回属性值。
-
__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、作用,用于设置对象属性。
-
__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、作用,用于删除对象属性。
-
__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.com!
注册 关于