这篇文章将为大家详细讲解有关Python实现单例模式的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点。
单例模式应该是应用最广泛,实现最简单的一种创建型模式。
特点:全局唯一,允许更改
优点:
避免对资源的多重占用,如写入文件操作
节省内存
防止命名空间被污染
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化
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): pass if __name__ == "__main__": ins = Singleton() print(id(ins)) ins = Singleton() print(id(ins))
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): pass if __name__ == "__main__": ins = Singleton() print(id(ins)) ins = Singleton() print(id(ins))
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: pass if __name__ == "__main__": ins = Singleton() print(id(ins)) ins = Singleton() print(id(ins))
- foo.py --> ins = Singleton() - bar.py --> from foo import ins
class Singleton: @classmethod def 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实现单例模式的方法有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。