_new__方法和__init__方法及单例模式
1.简单来说__new__方法和__init__方法都是类中的内置方法;这两个方法再实例化对象的时候会被自动调用;
2.__new__方法的调用在 __init__方法之前;
3.__new__方法中有个参数:cls ; __init__方法中有个参数是self
4.__new__方法的作用是:(1)为实例化对象分配一个空间(2)返回这个对象的引用
5.__init__方法的作用是对这个实例化对象再次加工;self指的就是这个实例化对象
看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class MusicPlayer( object ): #创建一个音乐播放器 def __new__( cls , * args, * * kwargs): print ( "创建对象,分配空间" ) # 1. 创建对象时,new方法会被自动调 instance = super ().__new__( cls ) # 2. 为对象分配空间 return instance # 3. 返回对象的引用,必须的有这个返回,不然self找不到对象 def __init__( self ,name): #初始化方法;对这个实例化对象再次加工<br> self.name = name print ( "播放器初始化" ) # 创建播放器对象 player = MusicPlayer( "小米" ) print (player) |
做个不是很恰当的比喻(暂时想到的这个);类就好比一张大楼的图纸;我们要按着这个图纸去建大楼;而__new__方法就好比建造这个大楼的地址,你是要在北京盖楼还是上海盖楼,必须有个明确的地址,而__init__方法就好比;有了图纸和地方就开始建楼吧。
二通过__new__方法实现单例模式
首先要明白什么是单例模式:简单理解就是一个类只能创建一个实例对象(还用上面这个比喻,就是说我们这个开发商比较小,只能拿到一块地皮;当我们第一次用这块地盖了楼,又想盖第二栋没有地皮怎么办啊,简单把把上次盖好的拆掉就又有地方了啊)
看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class MusicPlayer( object ): def __new__( cls , * args, * * kwargs): # 1. 创建对象时,new方法会被自动调用 print ( "创建对象,分配空间" ) # 2. 为对象分配空间 instance = super ().__new__( cls ) # 3. 返回对象的引用 return instance def __init__( self ): print ( "播放器初始化" ) # 创建播放器对象 player1 = MusicPlayer() player2 = MusicPlayer() print ( id (player1)) print ( id (player2)) |
打印结果:这是一个正常的实例化对象;创建了两个对象;这两个对象的ID是不一样的
1
2
3
4
5
6
|
创建对象,分配空间 播放器初始化 创建对象,分配空间 播放器初始化 2525789450312 2525789421464 |
单例模式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class MusicPlayer( object ): instance = None #定义一个类属性为None def __new__( cls , * args, * * kwargs): # 1. 创建对象时,new方法会被自动调用 print ( "创建对象,分配空间" ) if cls .instance is None : #如果这个类属性为None就为这个对象分配一个空间 # 2. 为对象分配空间 cls .instance = super ().__new__( cls ) # 3. 返回对象的引用 return cls .instance #否则返回上一个对象空间 def __init__( self ): print ( "播放器初始化" ) # 创建播放器对象 player1 = MusicPlayer() player2 = MusicPlayer() print ( id (player1)) print ( id (player2)) |
结果:
1
2
3
4
5
6
|
创建对象,分配空间 播放器初始化 创建对象,分配空间 播放器初始化 2300636655688 2300636655688 |
那么创建的两个实例化对象的id就一样了
摘自:https://www.cnblogs.com/yan-peng/p/9965628.html
本文作者:云龙
本文链接:https://www.cnblogs.com/yunlong-study/p/14325491.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步