
[python面向对象学习笔记六] 单例
发布日期:2021-05-07 00:09:12
浏览次数:26
分类:精选文章
本文共 2428 字,大约阅读时间需要 8 分钟。
1.概念
设计模式:针对某一特定问题的套路,或者说是成熟的解决方案,前任工作的总结。
单例设计模式:其目的:让类创建的对象,在系统中只有唯一的实例。就是,每次执行类名()创建对象的时候,创建的对象的内存地址都是一样的。
2.__new__方法
__类名__这位格式的方法为内置方法,__new__为object基类提供的内置的静态方法。
__new__方法的作用:在内存为对象分配空间、返回对象的引用。将引用传给python解释器后,会将引用作为对象的第一个参数,传给__init__方法,进行对象的初始化。
每次使用类名()创建对象的时候,解释器会自动调用两个方法:__new__分配空间、__init__对象初始化
__new__方法重写:代码非常固定,一定加上return super(). __new __(cls)。否则,解释器得不到对象引用。注意new方法是一个静态方法,需要主动传入cls参数。
重写的语法:
class MusicPlayer(object): def __new__(cls, *args, **kwargs): # 一个*表示多值的元组参数,两个*表示多值字典参数 # 1.为证实创建对象时,new方法会自动调用 print("创建对象,分配空间") # 2.为对象分配空间 instance = super().__new__(cls) # 调用父类的new方法 # 3.返回对象的引用 return instance def __init__(self): print("播放器初始化")# 创建播放器对象player = MusicPlayer()print(player)输出:创建对象,分配空间播放器初始化<__main__.MusicPlayer object at 0x0000019D74091288>
3.单例
思路:
(1)定义一个类属性,初始值为None(空对象),记录创建的第一个对象的引用。 (2)重写__new__方法。如果类属性 is None,调用父类分配空间,并记录在类属性中;否则返回类属性中记录的引用。class MusicPlayer(object): instance = None # 定义类属性,记录第一个对象的引用 def __new__(cls, *args, **kwargs): if cls.instance is None: # 说明第一个对象还没有被创建 cls.instance = super().__new__(cls) # 调用父类方法,为第一个对象分配空间 return cls.instance else: # 若对象不是第一个 return cls.instance # 返回类属性中保存的对象引用player1 = MusicPlayer()print(player1)player2= MusicPlayer()print(player2)输出:<__main__.MusicPlayer object at 0x000001CCB831DB48><__main__.MusicPlayer object at 0x000001CCB831DB48>
以上方法,可以实现对象的内存地址是一样的。但是会多次调用初始化方法。
扩展---------需求:只执行一次初始化方法
class MusicPlayer(object): instance = None init_flag = False # 记录是否执行过初始化动作 def __new__(cls, *args, **kwargs): if cls.instance is None: # 说明第一个对象还没有被创建 cls.instance = super().__new__(cls) # 调用父类方法,为第一个对象分配空间 return cls.instance else: # 若对象不是第一个 return cls.instance # 返回类属性中保存的对象引用 def __init__(self): if MusicPlayer.init_flag is False: # 通过类名. 的方式调用类属性 MusicPlayer.init_flag = True print("初始化播放器") # 执行初始化动作 else: returnplayer1 = MusicPlayer()print(player1)player2= MusicPlayer()print(player2)输出:初始化播放器<__main__.MusicPlayer object at 0x0000022AC77E1388><__main__.MusicPlayer object at 0x0000022AC77E1388>
以上方法,可以让初始化的动作只被执行一次,并不是只调一次初始化方法。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月12日 09时46分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
2021-05-09
三角网格体积计算
2021-05-09
现代3D图形编程学习-基础简介(2) (译)
2021-05-09
Github教程(3)
2021-05-09
vue实现简单的点击切换颜色
2021-05-09
vue3 template refs dom的引用、组件的引用、获取子组件的值
2021-05-09
深入浅出mybatis
2021-05-09
Zookeeper快速开始
2021-05-09
882. Reachable Nodes In Subdivided Graph
2021-05-09
402. Remove K Digits
2021-05-09
375. Guess Number Higher or Lower II
2021-05-09
650. 2 Keys Keyboard
2021-05-09
764. Largest Plus Sign
2021-05-09
214. Shortest Palindrome
2021-05-09
916. Word Subsets
2021-05-09
869. Reordered Power of 2
2021-05-09
1086 Tree Traversals Again
2021-05-09
1127 ZigZagging on a Tree
2021-05-09
1062 Talent and Virtue
2021-05-09
1045 Favorite Color Stripe
2021-05-09