python3中的单例模式

python3中的单例模式

单例模式:即确保某个类只有一个实例,且能够自行实例化并向系统提供这个实例,这个类称为单例类。单例中无论创建几个实例对象,都是对同一个内存对象操作。

python实现单例模式的方式:

元类、 带有__new__的普通类、 利用@装饰器

元类

class Singleton(type):
    # 元类构造继承type
    def __init__(self, name, bases, attrs):
        super(Singleton, self).__init__(name, bases, attrs)
        self.instance = None
    def __call__(self, *args, **kwargs):
        if not self.instance:
            self.instance = super(Singleton, self).__call__(*args, **kwargs) 
        return self.instance 
        
class Mysingle(metaclass=Singleton):
    pass
    
a = Mysingle()
b = Mysingle()
a.name = 'Apple'
print(id(a))
print(id(b))
print(a.name)
print(b.name)

# 单例模式中创建的实例id都应该相等
# 运行后结果
# print(id(a))
2156407246576
# print(id(b))
2156407246576  
# print(a.name)
Apple
# print(b.name)
Apple

__new__的 普通类

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, 'instance'):
            cls.instance = super().__init__(cls, *args, **kwargs)
        return cls.instance
        
a = Singleton()
b = Singleton()
print(id(a))
print(id(b))

# 运行结果
#print(id(a))
1872012432
#print(id(a))
1872012432

@装饰器

import functools

def singleton(cls):
    instance = {}
    @functools.wraps(cls)
    def wrapper(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return wrapper
    
@singleton
class Mysingleton(object):
    pass

a = Mysingleton()
b = Mysingleton()

print(id(a) == id(b))

# 运行结果
# print(id(a) == id(b))
True

俗话说,不会编程的音乐人不是一名好厨师,不会弹钢琴的运动员不是一位好画家,所以我成为了一名会理发的小瓦匠!

你可能感兴趣的:(python3中的单例模式)