干什么:创建全局唯一的实例.
情形:
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))