码迷,mamicode.com
首页 > 其他好文 > 详细

097 单例模式

时间:2019-09-11 19:55:58      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:str   cal   为什么   __call__   port   四种   acl   import   rom   

一、什么是单例模式

  • 整个过程中只有一个实例,所有生成的实例都指向同一块内存地址空间

二、为什么要用单例模式

  • 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
  • 这样可以节省内存空间

二、实现单例模式的四种方式

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 单例模式

标签:str   cal   为什么   __call__   port   四种   acl   import   rom   

原文地址:https://www.cnblogs.com/xichenHome/p/11508222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!