Python魔术方法深入分析讲解
HaiFan. 人气:0前言
魔术方法就是一个类/对象中的方法,和普通方法唯一的不同是:普通方法需要调用,而魔术方法是在特定时刻自动触发
__init__
初始化魔术方法
初始化魔术方法
如何触发:初始化对象时触发
参数:至少一个self
返回值:无
作用:初始化对象的成员
注:使用这个方式初始化的成员都是写入对象中的,类中不存在
class Person: def __init__(self,name): self.name = name a = Person('lisan') print(a.name)
__new__
实例化魔术方法
如何触发:在实例化对象时触发
参数:至少一个cls,接收当前类
返回值:必须返回一个对象实例
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的 __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.__new__(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)
当我们直接打印对象的时候,打印出来的是一个地址,这个地址我们是看不懂的,编译器才看得懂。
想打印对象名,要显示出准确的东西,就需要 __str__
class Person: def __init__(self,name): self.name = name def __str__(self): return self.name a = Person('lisan') print(a)
总结
__init__和__str__
这两个是重点。
__new__
的作用:开辟空间
__del__
的作用:没有指针引用的时候会调用,一般是不需要重写的
__call__
的作用:想不想让对象当函数用。
加载全部内容