python面试题之单例模式

Image

python面试题之单例模式

​单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

__new__()__init__()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例 这个绝对常考啊.绝对要记住1~2个方法,当时面试官是让手写的.

1、 使用new方法


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/4/20 13:27
# @Author  : 一叶知秋
# @File    : test7.py
# @Software: PyCharm
class Singleton(object):

    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)

        return cls._instance


class MyClass(Singleton):
    a = 1


if __name__ == '__main__':
    a = MyClass()
    b = MyClass()
    print('a:', id(a))
    print('b:', id(b))
    print(a is b)

运行结果:

a: 1995200289352
b: 1995200289352
True

2、 装饰器版本

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/4/20 13:27
# @Author  : 一叶知秋
# @File    : test7.py
# @Software: PyCharm

# 使用类装饰器实现单例
class Singleton(object):
    def __init__(self, cls):
        self._cls = cls
        self._instance = {}

    def __call__(self, *args, **kwargs):
        if self._cls not in self._instance:
            self._instance[self._cls] = self._cls(*args, **kwargs)
        return self._instance[self._cls]


# 使用函数装饰器实现单例
def singleton(cls):
    instances = {}

    def get_instance(*args, **kw):
        if cls not in instances:
            instances[cls] = cls(*args, **kw)

        return instances[cls]

    return get_instance


@Singleton
class MyClass:
    a = 1


if __name__ == '__main__':
    a = MyClass()
    b = MyClass()
    print('a:', id(a))
    print('b:', id(b))
    print(a is b)

运行结果:

a: 3077134387656
b: 3077134387656
True

希望对大家面试有帮助!

参考链接

  • https://github.com/taizilongxu/interview_python#16-%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F

你可能感兴趣的:(python面试题之单例模式)