python中init,new和call魔法方法的作用和区别
在python中,我们在python的类当中会经常遇到__init__,__new__,__call__等魔法方法。那么这三个有什么作用和区别呢?
- __new__:在类当中构造实例化对象,并将对象传递给到init,python解释器会提供一个cls。在整个类当中先执行此方法。
1.1__new__:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class B: def __new__( cls , * args, * * kwargs): print ( "new" ) return super ().__new__( cls ) def __init__( self , name): print ( "init" ) self .name = name def foo( self ): print ( "__foo__" ) b = B( 'shao' ) b.foo() # 打印结果: # new # init # __foo__ |
上述结果中,很清晰地说明了,执行类B,会先执行new方法,然后才去执行init方法。在应用中,可以通过重写new方法,来实现单例模式:实例化对象只有一个。
1.2实现单例模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class A( object ): _instance = None def __new__( cls , * args, * * kwargs): if not cls ._instance: cls ._instance = super ().__new__( cls ) return cls ._instance def __init__( self ,name): self .name = name print ( "__init__{}" . format ( self .name)) def foo( self ): print ( "__foo__" ) a = A( 'bruce' ) b = A( 'bruce' ) print (a, id (a)) print (b, id (b)) |
2.__init__:在类中对实例化对象进行初始化。
2.1__init__:
1 2 3 4 5 6 7 8 9 | class C: def __init__( self ,name): self .name = name def foo( self ): print ( '我是{}' . format ( self .name)) c = C( 'bruce' ) c.foo() <br> # 我是bruce |
3.__call__:在类中,允许创建可调用的对象(实例)。就是说可以让函数(方法)可以像对象一样被调用。以“对象名()”的形式使用。
3.1__call__:
1 2 3 4 5 6 7 | class B: def __call__( self , name, add): print ( '{}在调用__call__方法,添加了{}!' . format (name,add)) b = B() b( 'bruce' , '吃饭' ) # 实例化对象() 直接调用call方法<br># bruce在调用__call__方法,添加了吃饭! |
上述就是,以上三个魔法方法区别和运用。
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现