目录
- 前言
- __init__
- __new__
- __call__
- __del__
- __str__
- 总结
前言
魔术方法就是一个类/对象中的方法,和普通方法唯一的不同是:普通方法需要调用,而魔术方法是在特定时刻自动触发
__init__
初始化魔术方法
初始化魔术方法
如何触发:初始化对象时触发参数:至少一个self返回值:无作用:初始化对象的成员注:使用这个方式初始化的成员都是写入对象中的,类中不存在class Person: def __init__(self,name): self.name = name a = Person('lisan') print(a.name)
__new__
实例化魔术方法
如何触发:在实例化对象时触发
参数:至少一个cls,接收当前类
返回值:必须返回一个对象实例
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了ObjectNpRmJNC的 __new__
才能够实现实例化对象。没事别碰这个魔术方法,先触发__new__
,才会触发__init__
class Person: def __init__(self,name): print('------------init') self.name = name def __new__(cls,*args,**kwargs): print('----------new') return super(Person,cls).__new__(cls,*args,**kwargs) a = Person('lisan')
__call__
调用对象的魔术方法
如何触发:将对象当作函数调用时触发对象()
参数:至少一个self接收对象
返回值:根据情况而定
作用:可以将复杂的步骤进行合并操作,减少调用的步骤,方便使用
注意:无
class Person: def __init__(self): print('--------编程客栈----init') def __new__(cls ,*args ,**kwargs): print('----------new') ip = object.__NpRmJNCnew__(cls ,*args ,**kwargs) print(ip) return ip def __call__(self ,name): print('-----------call') print(f'执行对象得到的参数{name}') a = Person() a('nbnb')
__del__
析构魔术方法
如何触发:当对象没有用(没有任何变量引用)的时候触发
参数:一个self
返回值:无
作用:使用完对象是回收资源
注意:del不一定会触发当前方法,只有当前对象没有任何变量接收时才会触发
class Person: def __init__(self,name): self.name = name def __del__(self): pass a = Person('lisi') b = a print(b.name) b.name = 'wangwu' print(a.name)
通过del可以删除某对象对地址的引用。
通过import sys``sys.getrefcount(a)
可以查看对地址的引用次数。
当代码全部执行结束的时候,会自动执行del方法。
__str__
触发时机:当你打印对象名的时候自动触发,调用 __str__
里面的内容
注意:一定要加返回值,return后面的内容就是打印对象看到的内容。
class Person: def __init__(self,name): self.name = name # def __str__(self): # return self.name a = Person('lisan') print(a)
当我们直接打印对象的时候,打印出来的是一个地址,这个地址我们是看不懂的,php编译器才看得懂。
想打印对象名,要显示出准确的东西,就需要 __str__
class Person: def __init__(sel开发者_JAVA教程f,name): self.name = name def __str__(self): return self.name a = Person('lisan') print(a) 编程客栈
总结
__init__和__str__
这两个是重点。
__new__
的作用:开辟空间
__del__
的作用:没有指针引用的时候会调用,一般是不需要重写的
__call__
的作用:想不想让对象当函数用。
到此这篇关于python魔术方法深入分析讲解的文章就介绍到这了,更多相关Python魔术方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
精彩评论