有关单例的面试总结

152 阅读1分钟

newinit

init 并不是真正意义上的构造函数 只是在对象创建好之后初始化变量, 真正创建实例的是 new 方法.

class Person(object):
    # 观察 __new__ 和 __init__ 的执行顺序
    def __new__(cls, *args, **kwargs):
        print("in __new__")
        instance = object.__new__(cls)
        return instance

    def __init__(self, name, age):
        print("in __init__")
        self._name = name
        self._age = age


if __name__ == "__main__":
    p = Person("ruiyang", 25)

实现一个单例

class Home(object):
    # 实现一个单例

    # 表示这个类惟一的实例对象
    __instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, name):
        self.name = name


if __name__ == "__main__":
    ry = Home("ruiyang")
    print(ry.name)
    kl = Home("kailun")
    print(ry.name, kl.name)
    # 说明此时 ry 和 kl 都指向了同一个对象
    print(ry is kl)

利用 new 实现工厂模式

class Fruit(object):
    def __init__(self):
        pass

    def print_color(self):
        pass


class Apple(Fruit):
    def __init__(self):
        pass

    def print_color(self):
        print("apple is in red")


class Orange(Fruit):
    def __init__(self):
        pass

    def print_color(self):
        print("orange is in orange")


class FruitFactory(object):
    fruits = {"apple": Apple, "orange": Orange}

    def __new__(cls, name):
        if name in cls.fruits.keys():
            return cls.fruits[name]()
        else:
            return Fruit()


fruit1 = FruitFactory("apple")
fruit2 = FruitFactory("orange")
fruit1.print_color()
fruit2.print_color()

单例模式的应用场景

单例模式应用的场景一般发现在以下条件下:

  • 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。
  • 控制资源的情况下,方便资源之间的互相通信。如线程池等。 1.网站的计数器 2.应用配置 3.多线程池 4.数据库配置,数据库连接池 5.应用程序的日志应用....

参考

juejin.cn/post/684490…