一、new方法的作用
作用:new方法主要是在内存中为对象分配空间并且返回对象的引用
class Test(object):
def __new__(cls, *args, **kwargs):
print("new方法被执行啦")
test = Test()
print(test)
# 执行的结果:
new方法被执行啦
None
1、因为new方法是一个魔术方法(魔术方法就是类被加载的时候,就会自动执行的方法),所以我们创建一个Test的实例的时候,就执行了new方法,输出了"new方法被执行啦"这句话。
2、print一个实例,就是调用这个实例的str方法,我们没有重写str方法,所以应该会输出这个实例的内存地址值。
3、不过我们重写了new方法,所以内存中没有开辟空间,故而str只能输出None
二、什么时候重写new方法
因为python所有的类都是继承object类的,所以不重写new方法也照样能够继承下来使用,但是当我们想让任意个实例的内存地址值都是同一个时,我们就需要重写new方法了,几乎是个固定格式
总结:
需要使N个实例都是同一个内存地址时,重写new方法
需要时N个实例是N个内存地址时,不要重写new方法
class Test(object):
# 定义一个类属性
instance = None
# 重写new方法
def __new__(cls, *args, **kwargs):
# 判断类属性是否为空,如果为空,则调用父类的new方法开辟空间.
if cls.instance is None:
# 注意:new是一个静态方法,在调用时需要主动传递cls参数
cls.instance = super().__new__(cls)
return cls.instance
# 否则返回原有值
else:
return cls.instance
test01 = Test()
print(test01)
test02 = Test()
print(test02)
#执行结果
<__main__.Test object at 0x000001FFE50E9438>
<__main__.Test object at 0x000001FFE50E9438>
通过结果,我们可以看到,不管实例化几次,他们使用的地址值都是相同的。在单例设计模式中,这种写法非常常见。