单例模式
Posted xiongchao0823
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。
单例模式
什么是单例模式
- 单例模式:基于某种方法实例化多次得到的实例就是同一个
为什么用单例模式
- 当实例化多次得到的对象中存放的属性都是一样的情况,应该将多个对象指向同一个内存,
即同一个实例
1.单例模式(类内部定义静态方法)
name = 'xc'
pwd = 123
class mysql:
state = None # 最先开辟的内存空间,用来实现单例模式,也就是相同的对象使用同一个内存空间
def __init__(self,name,pwd):
self.name = name
self.pwd = pwd
@classmethod # 指定类方法
def get_memory(cls): # 定义类方法
if not cls.state: # 如果类中的state没有值
cls.state = cls(name,pwd) # 附上我们定义的默认值
return cls.state # 最后输出cls.state
a1 = Mysql.get_memory()
a2 = Mysql.get_memory()
a3 = Mysql.get_memory()
print(a1)
print(a2)
print(a3)
打印 -->
<__main__.Mysql object at 0x000001FA3E7924A8>
<__main__.Mysql object at 0x000001FA3E7924A8>
<__main__.Mysql object at 0x000001FA3E7924A8>
a4 = Mysql('xc',123)
打印 -->
<__main__.Mysql object at 0x0000021394F1B470>
2.单例模式(装饰器)
# setting.py
Name = 'xc'
Age = 18
def auth(cls):
import setting
cls.state = cls(setting.Name,setting.Age): # 定义一个默认值,也就是一个名称空间
def inner(*args,**kwargs)
if len(args) == 0 and len(kwargs) == 0:
return cls.state
return cls(*args,**kwargs)
return inner
@auth
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
p1 = Foo()
p2 = Foo()
p3 = Foo()
print(p1)
print(p2)
print(p3)
3.单例模式(元类)
# setting.py
Name = 'xc'
Age = 18
import setting
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic):
self.state = self(setting.Name,setting.Age) # 使用类的__init__,重写一个self.state到类的名称空间中,也就是Foo的名称空间
def __call__(self,*args,**kwargs):
if len(args) == 0 and len(kwargs) == 0:
return self.state
obj = self.__new__(self)
obj.__new__(*args,**kwargs)
return obj
class Foo(metaclass = Mymeta):
def __init__(self,name,age):
self.name = name
self.age = age
4.单例模式(模块)
- 模块是一个天然的单例
# setting.py
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
s = Foo('xc',18)
import setting.py
s1 = setting.s
s2 = setting.s
s3 = setting.s1
pring(s1)
print(s2)
print(s3)
5.单例模式(不同值,同一个内存空间)
class Foo:
state = None
def __init__(self,name,age):
self.name = name
self.age = age
def __new__(cls,*args,**kwargs):
if not cls.state:
cls.state = object.__new__(cls)
return cls.state
f1 = Foo('xc',123)
f2 = Foo('www',123)
print(f1)
print(f2)
打印 -->
-<__main__.Foo object at 0x000001EF71392400>
-<__main__.Foo object at 0x000001EF71392400>
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章