91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在python中怎么實現單例模式

發布時間:2020-04-25 16:47:46 來源:億速云 閱讀:200 作者:栢白 欄目:編程語言

在python中怎么實現單例模式?下面給大家帶來七種不同的方法:

一:staticmethod

代碼如下:

class Singleton(object):
    instance = None
    def __init__(self):
        raise SyntaxError('can not instance, please use get_instance')
    def get_instance():
        if Singleton.instance is None:
            Singleton.instance = object.__new__(Singleton)
        return Singleton.instance
a = Singleton.get_instance()
b = Singleton.get_instance()
print('a id=', id(a))
print('b id=', id(b))

該方法的要點是在__init__拋出異常,禁止通過類來實例化,只能通過靜態get_instance函數來獲取實例;因為不能通過類來實例化,所以靜態get_instance函數中可以通過父類object.__new__來實例化。

二:classmethod

和方法一類似,代碼:

class Singleton(object):
    instance = None
    def __init__(self):
        raise SyntaxError('can not instance, please use get_instance')
    def get_instance(cls):
        if Singleton.instance is None:
            Singleton.instance = object.__new__(Singleton)
        return Singleton.instance
a = Singleton.get_instance()
b = Singleton.get_instance()
print('a id=', id(a))
print('b id=', id(b))

該方法的要點是在__init__拋出異常,禁止通過類來實例化,只能通過靜態get_instance函數來獲取實例;因為不能通過類來實例化,所以靜態get_instance函數中可以通過父類object.__new__來實例化。

三:類屬性方法

和方法一類似, 代碼:

class Singleton(object):
    instance = None
    def __init__(self):
        raise SyntaxError('can not instance, please use get_instance')
    def get_instance():
        if Singleton.instance is None:
            Singleton.instance = object.__new__(Singleton)
        return Singleton.instance
a = Singleton.get_instance()
b = Singleton.get_instance()
print(id(a))
print(id(b))

該方法的要點是在__init__拋出異常,禁止通過類來實例化,只能通過靜態get_instance函數來獲取實例;因為不能通過類來實例化,所以靜態get_instance函數中可以通過父類object.__new__來實例化。

四:__new__

常見的方法, 代碼如下:

class Singleton(object):
    instance = None
    def __new__(cls, *args, **kw):
        if not cls.instance:
            # cls.instance = object.__new__(cls, *args)
            cls.instance = super(Singleton, cls).__new__(cls, *args, **kw)
        return cls.instance
a = Singleton()
b = Singleton()
print(id(a))
print(id(b))

五:裝飾器

代碼如下:

def Singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance
class MyClass:
    pass
a = MyClass()
b = MyClass()
c = MyClass()
print(id(a))
print(id(b))
print(id(c))

六:元類

python2版:

class Singleton(type):
    def __init__(cls, name, bases, dct):
        super(Singleton, cls).__init__(name, bases, dct)
        cls.instance = None
    def __call__(cls, *args):
        if cls.instance is None:
            cls.instance = super(Singleton, cls).__call__(*args)
        return cls.instance
class MyClass(object):
    __metaclass__ = Singleton
a = MyClass()
b = MyClass()
c = MyClass()
print(id(a))
print(id(b))
print(id(c))
print(a is b)
print(a is c)

或者:

class Singleton(type):
    def __new__(cls, name, bases, attrs):
        attrs["_instance"] = None
        return super(Singleton, cls).__new__(cls, name, bases, attrs)
    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance
class Foo(object):
    __metaclass__ = Singleton
x = Foo()
y = Foo()
print(id(x))
print(id(y))

python3版:

class Singleton(type):
    def __new__(cls, name, bases, attrs):
        attrs['instance'] = None
        return super(Singleton, cls).__new__(cls, name, bases, attrs)
    def __call__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls.instance
class Foo(metaclass=Singleton):
    pass
x = Foo()
y = Foo()
print(id(x))
print(id(y))

七:名字覆蓋

代碼如下:

class Singleton(object):
    def foo(self):
        print('foo')
    def __call__(self):
        return self
Singleton = Singleton()
Singleton.foo()
a = Singleton()
b = Singleton()
print(id(a))
print(id(b))

以上就是在python中怎么實現單例模式的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广东省| 得荣县| 宿迁市| 宜章县| 舟山市| 太原市| 深水埗区| 略阳县| 神农架林区| 萨迦县| 平凉市| 驻马店市| 石阡县| 盘山县| 元朗区| 肥城市| 两当县| 朝阳市| 东乡县| 合山市| 顺义区| 响水县| 贺州市| 西安市| 炎陵县| 济南市| 浙江省| 博客| 乐都县| 轮台县| 沐川县| 雷州市| 巴彦淖尔市| 曲沃县| 浪卡子县| 巴塘县| 兴和县| 皮山县| 南乐县| 昭苏县| 汉寿县|