【Python】用元类实现单例模式

单例模式

在类中增加一个标识符,存储当前实例。如果为空就创建,如果已经被创建了就不重新创建,直接返回实例化。

如果同时创建了两个,那么两个对象都是一样的(包括数据和内存地址)。保证一个类仅有一个实例,并提供与一个访问它的全局访问点,避免一个全局使用的类频繁的创建与销毁。


class MyType(type):

    def __init__(self, name: str, bases: tuple, attrs: dict) -> None:
        """__init__参数解释

        Args:
            name (str): 类名
            bases (tuple): 继承哪些类
            attr (dict): 类中有哪些成员
        """
        super().__init__(name, bases, attrs)
        self._inistance = None
   
    def __call__(self, *args, **kwargs):
        # 判断是否已有对象
        if not self._inistance:
            self._inistance = self.__new__(self)
        self.__init__(self._inistance, *args, **kwargs)
        return self._inistance

# 简写单例模式
class Singleton(object, metaclass=MyType): pass

class Foo(Singleton): pass

v1 = Foo()
v2 = Foo()

此时的v1和v2的内存地址都是一样的,self._inistance不为空,代表已经有相同的实例创建过,所以直接返回已经创建好的实例。

v1: <__main__.Foo object at 0x01CD9D70>

v2: <__main__.Foo object at 0x01CD9D70>

posted @ 2021-11-03 16:17  阿初  阅读(150)  评论(0)    收藏  举报