python单例模式

new方法的一个用途时初始化不可变对象,方法中允许创建未初始化的对象,所以这可以在 init 方法调用之前设置对象的属性。

new方法始终是一个静态方法 (staticmethod),因为他的工作创建好一个对象赋值给self。

所有类的父类都是object, 所以new方法最终会调用 object._new_ 来创建一个简单的空对象。

new方法最终会把除了 cls 之外的参数和关键字传递个 init 方法, 这是python定义的标准行为。

单实例模式

class F:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance
    
>> f1 = F()
>> print(f1)
>> <__main__.F1 object at 0x0000021EACD42470>
>> f2 = F()
>> print(f2)
>> <__main__.F1 object at 0x0000021EACD42470>

new方法不会被继承

class F1:
    def __new__(cls, *args, **kwargs):
        print(args, kwargs)
        return super().__new__(cls)
class F2:
    pass


>> f = F1(1,2,custom=10)
>> f2 = F2(1,2,custom=10)  #这句话将会报错,因为这个类没有任何实现
>> Traceback (most recent call last):
  File "C:/Users/q1403/PycharmProjects/tutorial/test.py", line 11, in <module>
    f2 = F2(1,2,custom=10)
TypeError: F2() takes no arguments