Python-单例模式-只初始化一次

##单例模式 只初始化一次

单例模式创建的原理就是借用了私有类属性的性质,我们知道私有类属性不能直接在类外被修改,所以用私有类属性的状态当做条件来控制类内方法的调用

方法一:

下面代码中的__species负责控制__new__方法,保证实例对象只能被创建一次,创建多个对象,均指向同一个数据内存位置

__first_init负责控制__init__方法,保证再次创建的对象不能更改初始化的内容

class Animal(object):

    __species = None
    __first_init = True
    
    def __new__(cls, *args, **kwargs):
        if cls.__species == None:
            cls.__species = object.__new__(cls)
        return cls.__species

    def __init__(self,name):
        print("-----init----")
        if self.__first_init:
            self.name = name
            self.__class__.__first_init = False
            # 相当于Animal.__first_init = False

    def __str__(self):
        return "-------str---%s" %self.name


if __name__ == '__main__':
    dog = Animal('二哈')
    print(dog)
    print(id(dog))  
    dog2 = Animal('金毛')
    print(dog)
    print(id(dog2))

执行结果:
-----init----
-------str---二哈
139764904013104
-----init----
-------str---二哈
139764904013104


调用new方法必须要有return, 返回创建的实例对象或者是父类的__new__方法创建实例对象

由执行结果可知,两次创建的实例对象指向了同一个id,即 创建单例模式
第二次创建的实例对象dog2“金毛”,并未创建成功,仍然是第一次创建出来的实例对象dog"二哈",即 初始化一次

方法二:

import functools

def singleton(cls):
    _instances = {}
    @functools.wraps(cls)
    def get_instance(*args, **kwargs):
        if cls not in _instances:
            _instances[cls] = cls(*args, **kwargs)
        return _instances[cls]
	 return get_instance


@singleton
class Animal:

    def __init__(self, name):
        print("-----init----")
        self.name = name

    def __str__(self):
        return "-------str---%s" % self.name


if __name__ == '__main__':
    dog = Animal('二哈')
    print(dog)
    print(id(dog))
    dog2 = Animal('金毛')
    print(dog)
    print(id(dog2))

执行结果:
-----init----
-------str—二哈
4327353816
-------str—二哈
4327353816

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单例模式是一种设计模式,它确保一个类只能有一个实例,并提供一个全局访问点来访问该实例。 在Python中,可以使用以下方式实现单例模式: 1. 使用模块级别的变量:在模块中定义一个变量,将其初始化为类的实例,然后在需要使用类的地方导入该模块。由于模块只会被导入一次,所以该变量也只会被创建一次,从而实现了单例模式。 ```python # singleton.py class SingletonClass: def __init__(self): # 初始化操作 pass # 创建一个单例对象 singleton_obj = SingletonClass() # main.py from singleton import singleton_obj # 使用单例对象 ``` 2. 使用装饰器:可以使用装饰器来包装类,使其只能创建一个实例。 ```python def singleton(cls): instances = {} def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class SingletonClass: def __init__(self): # 初始化操作 pass # 创建单例对象 obj1 = SingletonClass() obj2 = SingletonClass() print(obj1 is obj2) # 输出:True ``` 3. 使用元类(Metaclass):可以通过定义一个元类,控制类的创建过程,从而实现单例模式。 ```python class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class SingletonClass(metaclass=SingletonMeta): def __init__(self): # 初始化操作 pass # 创建单例对象 obj1 = SingletonClass() obj2 = SingletonClass() print(obj1 is obj2) # 输出:True ``` 这些都是实现单例模式的常用方法,你可以根据自己的需求选择合适的方式来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值