干什么:创建全局唯一的实例.
情形:
1.需要频繁的创建和销毁对象.消耗巨大.
2.节省系统资源
比如如 I/O 与数据库的连接.
换句话说:
- 某个类在在同一时刻不能有多种实例状态,即【单态】(例如:操作系统的任务管理器、回收站、文件系统;应用程序的日志应用、网站的计时工具或ID(序号)生成器);
- 或者某个类只需要一个实例就够用了,即【单例】,多的实例不会有什么坏的影响,但也没什么作用,只是徒增资源消耗而已(例如:数据库连接池、线程池、web开发中读取配置文件)。
1,brog模式,可以有很多实列,但是共享一个状态.
class Brog(object):
_shared_state = {}
def __init__(self, name=None):
self.__dict__ = self._shared_state
if name:
self.name = name
def __str__(self):
return self.state
class SubBrog(Brog):
def __init__(self, name=None):
super().__init__()
if name:
self.name = name
if self.state:
pass
else:
if hasattr(self, "state"):
self.state = "init"
def __str__(self):
return self.state
if __name__ == "__main__":
b1 = Brog("小米")
b2 = Brog("小生")
b1.state = "runing"
print(b1)
print(b2)
print(dir(b2))
print(id(b1))
print(id(b2))
sub = SubBrog("sub")
sub.state = "good"
sub2 = SubBrog("ximi")
print(sub)
print(sub2)
python中对于类的创建有几种方法。
1,__call__ ,元类创建子类的时候会调用
2,__new__实例化类必须调用的方法,需要返回值。
3.__init__初始化实例参数调用的方法
class Singleton(object):
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance:
return cls._instance
else:
cls._instance = super().__new__(cls, *args, **kwargs)
return cls._instance
class SingletonStatic():
_instance = None
@classmethod
def getinstance(cls):
if not cls._instance:
cls._instance = cls()
return cls._instance
if __name__ == "__main__":
a = SingletonStatic().getinstance()
b = SingletonStatic().getinstance()
# a = Singleton()
# b = Singleton()
print(id(a), id(b))
这篇博客探讨了Python中实现单例模式的两种方法,Brog模式和Singleton模式,以及它们在节省系统资源和确保类只有一个实例时的应用。通过示例代码展示了如何创建和使用这些模式,并对比了不同方法的实现细节。同时,提到了Python中类的创建方式,包括__call__, __new__和__init__方法的作用。
933

被折叠的 条评论
为什么被折叠?



