欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

Python 5种方法实现单例模式

发布时间:2025/3/20 python 21 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Python 5种方法实现单例模式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

基本介绍

一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点。

单例模式应该是应用最广泛,实现最简单的一种创建型模式。

特点:全局唯一,允许更改

优缺点

优点:

  • 避免对资源的多重占用,如写入文件操作

  • 节省内存

  • 防止命名空间被污染

缺点:

  • 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

Python实现

方式1,元类实现:

class MetaClass(type):def __call__(self, *args, **kwargs):"""self : class Singleton"""if not hasattr(self, "ins"):insObject = super(__class__, self).__call__(*args, **kwargs)setattr(self, "ins", insObject)return getattr(self, "ins")class Singleton(object, metaclass=MetaClass):passif __name__ == "__main__":ins = Singleton()print(id(ins))ins = Singleton()print(id(ins))

方式2,继承实现:

''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' class ParentClass:def __new__(cls, *args, **kwargs) -> object:"""cls : class Singeton"""if not hasattr(cls, "ins"):insObject = super(__class__, cls).__new__(cls, *args, **kwargs)setattr(cls, "ins", insObject)return getattr(cls, "ins")class Singleton(ParentClass):passif __name__ == "__main__":ins = Singleton()print(id(ins))ins = Singleton()print(id(ins))

方式3,装饰器实现:

''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' def warpper(clsObject):def inner(*args, **kwargs):if not hasattr(clsObject, "ins"):insObject = clsObject(*args, **kwargs)setattr(clsObject, "ins", insObject)return getattr(clsObject, "ins")return inner@warpper class Singleton:passif __name__ == "__main__":ins = Singleton()print(id(ins))ins = Singleton()print(id(ins))

方式4,模块实现:

- foo.py --> ins = Singleton() - bar.py --> from foo import ins

方式5,@classmethod实现单例模式:

class Singleton:@classmethoddef getSingletonInstanceObject(cls, *args, **kwargs):if not hasattr(cls, "ins"):insObject = cls(*args, **kwargs)setattr(cls, "ins", insObject)return getattr(cls, "ins")if __name__ == "__main__":ins = Singleton.getSingletonInstanceObject()print(id(ins))ins = Singleton.getSingletonInstanceObject()print(id(ins))

总结

以上是生活随笔为你收集整理的Python 5种方法实现单例模式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。