097 单例模式
Posted xichenhome
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了097 单例模式相关的知识,希望对你有一定的参考价值。
一、什么是单例模式
- 整个过程中只有一个实例,所有生成的实例都指向同一块内存地址空间
二、为什么要用单例模式
- 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
- 这样可以节省内存空间
二、实现单例模式的四种方式
1.通过类的绑定方法来实现
- 也就是通过类的静态方法来实现
name = 'xichen'
age = 18
class Mydic:
_instance = None
def __init__(self,name,age):
self.name = name
self.age = age
@classmethod
def get_object(cls):
if not cls._instance:
cls._instance = cls(name,age)
return cls._instance
obj1 = Mydic.get_object()
print(obj1)
obj2 = Mydic.get_object()
print(obj2)
obj3 = Mydic(name = 'nick',age = 19)
print(obj3)
<main.Mydic object at 0x000001D3B8841978>
<main.Mydic object at 0x000001D3B8841978>
<main.Mydic object at 0x000001D3BF6ECD68>
2.通过装饰器来实现
- 我们之前用装饰器的时候是在做atm购物车的时候和选课系统的时候做的
- 装饰器里的func--->这里指的是cls,用这个装饰器的类
name = 'xichen'
age = 18
def wrapper(func):
func._instance = func(name, age)
def inner(*args,**kwargs):
if len(args) == 0 and len(kwargs) == 0:
return func._instance
return func(*args, **kwargs)
return inner
@wrapper
class Mydic:
def __init__(self,name,age):
self.name = name
self.age = age
obj1 = Mydic()
print(obj1)
obj2 = Mydic()
print(obj2)
obj3 = Mydic(name = 'nick',age = 19)
print(obj3)
<main.Mydic object at 0x0000015AEA2C92B0>
<main.Mydic object at 0x0000015AEA2C92B0>
<main.Mydic object at 0x0000015AEA0F9E80>
3.通过元类来实现
name = 'xichen'
age = 18
class Mymeta(type):
def __init__(self,name,bases,dic):
self._instance=self(name, age)
def __call__(self, *args, **kwargs):
if len(args)==0 and len(kwargs)==0:
return self._instance
else:
obj=object.__new__(self)
obj.__init__(*args, **kwargs)
return obj
class Mydic(metaclass=Mymeta):
def __init__(self,port,host):
self.port=port
self.host=host
obj1=Mydic()
print(obj1)
obj2=Mydic()
print(obj2)
obj3=Mydic('nick',19)
print(obj3)
<main.Mydic object at 0x000001D58E28CDA0>
<main.Mydic object at 0x000001D58E28CDA0>
<main.Mydic object at 0x000001D58E28CC88>
4.通过模块类实现
# Mydic.py
import settings
class Modlers():
def __init__(self,name,age):
self.name = name
self.age = age
s1= Modlers(settings.name,settings.age)
# settings.py
name = 'xichen'
age = 18
def test():
from mydic import s1
print(s1)
def test2():
from mydic import s1 as s2
print(s2)
test()
test2()
from mydic import s1
from mydic import Modlers
s2 = Modlers('nick',19)
print(s2)
<mydic.Modlers object at 0x0000019967C8CF28>
<mydic.Modlers object at 0x0000019967C8CF28>
<mydic.Modlers object at 0x000002AAFC639128>
以上是关于097 单例模式的主要内容,如果未能解决你的问题,请参考以下文章