097 單例模式

1、什麼是單例模式

  • 整個過程當中只有一個實例,全部生成的實例都指向同一塊內存地址空間

2、爲何要用單例模式

  • 當實例化屢次獲得的對象中存放的屬性都同樣的狀況,應該將多個對象指向同一個內存,即同一個實例
  • 這樣能夠節省內存空間

2、實現單例模式的四種方式

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>python

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>app

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>code

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>內存

相關文章
相關標籤/搜索