WELCOME

不积跬步,无以至千里;不积小流,无以成江海。

Python--常用魔术方法

魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发。

 

1.__init__

初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 参数:至少有一个self,接收对象 返回值:无 作用:初始化对象的成员 注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有
创建完空间之后调用的第一个方法

 

2.__new__

实例化魔术方法 触发时机: 在实例化对时触发 参数:至少一个cls 接收当前类 返回值:必须返回一个对象实例 作用:实例化对象 注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。 没事别碰这个魔术方法,先触发__new__才会触发__init__ '

 

1 # 魔术方法 2 class Person(): 3 ''' 4 初始化魔术方法 5 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 6 ''' 7 8 def __init__(self, name): 9 print('===init====',self) 10 self.name = name 11 12 def __new__(cls, *args, **kwargs): # __new__ 向内存空间要地址 13 ''' 14 实例化魔术方法 15 触发时机: 在实例化对时触发 16 ''' 17 print('===new===') 18 position = object.__new__(cls) 19 print(position) 20 return position 21 22 # 由object开辟一个内存空间,然后扔给self,然后self在内存空间里放了一个name,又把地址扔给p 23 p = Person('tom') 24 print(p) 25 26 ''' 27 <__main__.Person object at 0x00000232853ED388> 28 ===init==== <__main__.Person object at 0x00000232853ED388> 29 <__main__.Person object at 0x00000232853ED388> 30 '''

 

new__方法的作用是申请内存开辟空间 流程是: 1、Person()进行到__new__进行申请空间,position就是新空间,然后返回给__init__ 2、__init__接收到__new__返回的新空间positon,进行初始化。 3、p =Person()接受到__init__执行完毕的地址,p =position。

 

3.__call__

调用对象的魔术方法
触发时机:将对象当作函数调用时触发
对象()
参数:至少一个self接收对象,其余根据调用时参数决定
返回值:根据情况而定
作用:可以将复杂的步骤进行合并操作,减少调用的步骤,方便使用
注意:无
1 # 魔术方法 2 class Person(): 3 ''' 4 初始化魔术方法 5 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 6 ''' 7 8 def __init__(self, name): 9 print('---------->init', self) 10 self.name = name 11 12 def __new__(cls, *args, **kwargs): # __new__ 向内存空间要地址 13 ''' 14 实例化魔术方法 15 触发时机: 在实例化对时触发 16 ''' 17 position = object.__new__(cls) # 由object开辟一个内存空间,然后扔给self,然后self在内存空间里放了一个name,又把地址扔给p 18 print('------------>new', position) 19 return position 20 21 def __call__(self, name): 22 print('--------->call') 23 print('执行对象得到参数是:',name) 24 25 p = Person('tom') 26 print('---------->p', p) 27 print(p.name) 28 # 将对象当成函数去使用 29 p('jack') # 默认执行__call__ 30 ''' 31 ------------>new <__main__.Person object at 0x00000221A4200348> 32 ---------->init <__main__.Person object at 0x00000221A4200348> 33 ---------->p <__main__.Person object at 0x00000221A4200348> 34 tom 35 --------->call 36 执行对象得到参数是: jack 37 '''

 

4.__del__

析构魔术方法 触发时机:当对象没有用(没有任何变量引用)的时候被触发 返回值:无 作用:使用完对象是回收资源 注意:del不一定会触发当前方法,只有当前对象没有任何变量接收时才会触发
1.对象赋值:p = Person() p1 = p 说明:p和p1共同指向同一块地址 2.删除地址引用: del p1 删除p1对地址的引用 3.查看对地址的引用次数: import sys sys.getrefcount() 自己也会引用一次括号这个对象 4.当一块空间没有了任何引用,默认执行__del__
1 import sys 2 3 4 class Person: 5 def __init__(self, name): 6 self.name = name 7 8 def __del__(self): 9 print('----------->del') 10 11 12 p = Person('jack') 13 p1 = p 14 p2 = p 15 print(p1.name) 16 print(p2.name) 17 18 p1.name = 'tom' 19 20 print(p.name) 21 print(p1.name) 22 23 print(sys.getrefcount(p)) 24 25 del p2 # 断掉了p2的引用 26 print('删除p2后打印', p.name) 27 28 print(sys.getrefcount(p)) 29 30 del p1 # 断掉了p1的引用 31 print('删除p1后打印', p.name) 32 print(sys.getrefcount(p)) # 获取这个对象的引用个数(这个函数自身会引用一次) 33 34 del p 35 36 n = 3 37 print(n) 38 39 ''' 40 jack 41 jack 42 tom 43 tom 44 4 45 删除p2后打印 tom 46 3 47 删除p1后打印 tom 48 2 49 3 50 ----------->del 51 '''

 

5.__str__

触发时机:使用print(对象)或者str(对象)打印对象名的时候 参数:一个self接收对象 返回值:必须是字符串类型 作用:print(对象时)进行操作,得到字符串,通常用于快捷操作 注意:一定要在__str__方法中添加return,return后面的内容就是打印的内容
1 class Person: 2 def __init__(self, name, age): 3 self.name = name 4 self.age = age 5 6 def __str__(self): 7 return '姓名是:' + self.name + ',年龄:' + str(self.age) 8 9 10 p = Person('tom', 18) 11 print(p) 12 # 没有使用__str__: 13 # >> <__main__.Person object at 0x000002AD7110CE48> 14 15 # 使用__str__: 16 # >> 姓名是:tom,年龄:18

 


__EOF__

本文作者Ambitious
本文链接https://www.cnblogs.com/ambitiousPlus/p/16074053.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Ambitious~  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示