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